我正在尝试对 pair 和 int 的 vector 进行排序,如下所示。但没有得到预期的输出。在实际输出中,最后一个元素应该在第二个元素之前。有人可以解释一下我缺少什么吗?
int main()
{
using elem_type = std::pair<std::pair<int,int>,int>;
std::vector<elem_type> vec;
vec.push_back(std::make_pair(std::make_pair(3, 1), 2));
vec.push_back(std::make_pair(std::make_pair(6, 5), 4));
vec.push_back(std::make_pair(std::make_pair(6, 4), 7));
vec.push_back(std::make_pair(std::make_pair(5, 4), 6));
auto cmp = [](const elem_type & left, const elem_type & right){
return ((left.first.first< right.first.first)
&&
(left.first.second < right.first.second));
};
std::sort(vec.begin(), vec.end(), cmp);
//print sorted vector
for(size_t i = 0; i < vec.size(); ++i){
std::cout << vec[i].first.first << " " << vec[i].first.second << " " << vec[i].second << "\n";
}
}
预期输出
3 1 2
5 4 6
6 4 7
6 5 4
实际输出
3 1 2
6 5 4
6 4 7
5 4 6
最佳答案
你还没有解释你想如何对你的三元组进行排序,所以我只能说你的期望是错误的。
您的比较函数认为您的最后三个元素相等。
三元组 (x0,x1,x2)
被认为小于另一个三元组 (y0,y1,y2)
如果x0 < y0
和 x1 < y1
.例如,比较 (6,4,7)
时和 (6,5,4)
, 两个三元组都不被认为小于另一个,因为每个三元组中的第一个数字相同( 6 < 6
为假)。同样,(5,4,6)
被认为等于 (6,4,7)
因为两者都不小于另一个(4 < 4
为假)。
您唯一可能合理期望的是 (5,4,6) < (6,5,4)
, 但你的比较函数也说这两个都等于 (6,4,7)
.换句话说,该函数声称存在值 a
。 , b
, c
其中 a = b
和 b = c
但是a < c
.这没有意义,所以您的比较功能已损坏。
如果您想要的只是字典顺序,you don't need to do anything special :
std::sort(vec.begin(), vec.end());
std::pair
首先按其第一个组件排序;如果它们相等,则比较第二个组件。这似乎正是您所期望的行为。
关于c++ - 我的比较功能有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56085801/