pen*_*gon 5 c++ sorting algorithm
给定一个版本号数组,如下所示:
vector<string> v = { "9.8.17.5295", "9.13.0.0",
"12.3.9.1017", "25.3.6.1" };
Run Code Online (Sandbox Code Playgroud)
在 C++ 中对它们进行排序的最佳方法是什么?当然,这里的问题是,我们不能只按字典顺序对它们进行排序,而是必须将每个字符串拆分为多个组件,并按数字方式比较这些组件。在 Python 中可以这样完成:
v.sort(key=lambda x : tuple(map( int, x.split('.'))))
Run Code Online (Sandbox Code Playgroud)
但如何在 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", "9.13.0.0", "12.3.9.1017" };
sort( v.begin(), v.end(), []( string s1, string s2 )
{ return splitversion( s1 ) < splitversion( s2 ); } );
}
Run Code Online (Sandbox Code Playgroud)
当然,sscanf 不被 C++ 人员所接受,所以我可能不得不用其他东西替换它,但据我所知,它会变得更加麻烦。你会怎么做?
没有人会皱眉:)这看起来是一个不错的解决方案。更快的解决方案是对每个元素进行散列并根据散列进行排序。哈希示例如下:
array<int, 4> z;
sscanf( s.c_str(), "%d.%d.%d.%d", &z[0], &z[1], &z[2], &z[3] );
unsigned long long hash = (z[0] << 24) + (z[1] << 16) + (z[2] << 8) + z[3];
Run Code Online (Sandbox Code Playgroud)
在长向量上,检查原始数组/向量并根据哈希值进行排序将明显更快。这将需要更多代码。至于最少的代码,你的非常好。您可以使用 lambda 函数,但它们的可读性较差。