在C中对版本号数组进行排序
发布时间:2020-12-16 07:06:38 所属栏目:百科 来源:网络整理
导读:给出一个这样的版本号数组: vectorstring v = { "9.8.17.5295","9.13.0.0","12.3.9.1017","25.3.6.1" }; 在C中对它们进行排序的最佳方法是什么?当然,问题在于我们不能只按字典顺序对它们进行排序,但我们必须将每个字符串拆分成组件并以数字方式比较这些组
给出一个这样的版本号数组:
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函数,但它们的可读性较差. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |