加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在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函数,但它们的可读性较差.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读