Дан массив номеров версий, как это:Сортировка массива номеров версий в 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", "9.13.0.0", "12.3.9.1017" };
sort(v.begin(), v.end(), [](string s1, string s2)
{ return splitversion(s1) < splitversion( s2); });
}
Конечно, sscanf настоящее время неодобрительно C++ людей, так что я, возможно, придется заменить его на что-то другое, но, насколько я могу сказать, то это становится еще более громоздким. Как вы это сделаете?
Выполняет '' '' на 'std :: array' так, как вы ожидаете (отдавая предпочтение первому элементу и т. Д.)? –
Я точно ожидаю. Компилятор не жаловался, поэтому этот оператор существует, и каким другим способом он мог работать? – pentadecagon
Он может быть реализован как a0