在C中对版本号数组进行排序

在C中对版本号数组进行排序,第1张

概述给出一个这样的版本号数组: vector<string> v = { "9.8.17.5295", "9.13.0.0", "12.3.9.1017", "25.3.6.1" }; 在C中对它们进行排序的最佳方法是什么?当然,问题在于我们不能只按字典顺序对它们进行排序,但我们必须将每个字符串拆分成组件并以数字方式比较这些组件.在Python中,它 给出一个这样的版本号数组:

vector<string> v = { "9.8.17.5295","9.13.0.0","12.3.9.1017","25.3.6.1" };

在C中对它们进行排序的最佳方法是什么?当然,问题在于我们不能只按字典顺序对它们进行排序,但我们必须将每个字符串拆分成组件并以数字方式比较这些组件.在Python中,它可以这样做:

v.sort(key=lambda x : tuple(map( int,x.split('.'))))

但是如何在C中做到这一点?无论我能想出什么,与这种单线相比看起来相当麻烦.我到目前为止找到的最好的是:

array<int,4> splitversion( const string& s ){    array<int,4> z;    sscanf( s.c_str(),"%d.%d.%d.%d",&z[0],&z[1],&z[2],&z[3] );    return z;}int main(){    vector<string> v = { "9.8.17.5295","25.3.6.1","12.3.9.1017" };    sort( v.begin(),v.end(),[]( string s1,string s2 )          { return splitversion( s1 ) < splitversion(  s2 ); } );}

当然,sscanf正被C人所诟病,所以我可能不得不用别的东西替换它,但据我所知,它变得更加麻烦.
你会怎么做?

解决方法 没有人会皱眉:)
这看起来不错.
更快的解决方案是散列每个元素并根据哈希值进行排序.
示例哈希将是:

array<int,4> z;sscanf( s.c_str(),&z[3] );unsigned long long hash = (z[0] << 24) +  (z[1] << 16) +  (z[2] << 8) + z[3];

越过原始数组/向量并根据哈希值进行排序将在长向量上显着更快.这将需要更多代码.至于最少的代码,你是非常好的.您可以使用lambda函数,但它们的可读性较差.

总结

以上是内存溢出为你收集整理的在C中对版本号数组进行排序全部内容,希望文章能够帮你解决在C中对版本号数组进行排序所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1226986.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存