我正在尝试如下对对和整数对的向量进行排序。但是没有得到预期的输出。在实际输出中,最后一个元素应该在第二个元素之前。有人可以解释一下我缺少的内容吗?
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
答案 0 :(得分:3)
您尚未说明如何对三元组进行排序,所以我只能说您的期望是错误的。
您的比较函数会将您的最后三个元素视为相等。
如果(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
首先按其第一部分排序;如果相等,则比较第二部分。这似乎正是您所期望的行为。