我有一个vector<tuple<string, float> >
存储两个节点之间的欧氏距离和节点名称的 vector 。我需要首先按距离值对该 vector 进行排序,然后按字符串值排序。在两个节点具有相同欧几里德距离的情况下,它们的排序位置解析为按节点名称的字母(字典顺序)顺序完成。目前,我有一个自定义排序辅助函数,它首先按浮点值对 vector 进行排序。
bool sort_second(const tuple<string, float>& a, const tuple<string, float>& b) {
return (get<1>(a) < get<1>(b));
}
并调用sort(vec.begin(), vec.end(), sort_second)
像这样。但如果节点foo
和bar
具有相同的距离,有可能 foo
之前 bar
即使bar
应该是第一。我将如何对 vector 进行第二次排序(或者更好的是,在第一次通过时),这样我就不会弄乱我已经计算的值顺序?谢谢
最佳答案
使用std::tie
像元组颠倒一样排序:
bool sort_reversed(const tuple<string, float>& a, const tuple<string, float>& b)
{
return std::tie(get<1>(a), get<0>(a)) < std::tie(get<1>(b), get<0>(b));
}
或者如果您希望手动完成:
bool sort_second(const tuple<string, float>& a, const tuple<string, float>& b)
{
return (get<1>(a) < get<1>(b)) ||
((get<1>(a) == get<1>(b)) && (get<0>(a) < get<0>(b)));
}
关于C++ 按数值对 tuple<string, float> vector 进行排序,然后按字典顺序排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58909338/