c++ - 我的比较功能有什么问题?

标签 c++ sorting

我正在尝试对 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 < y0x1 < 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 = bb = 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/

相关文章:

java - 测试随机数生成器

Javascript sort() 不能正确按字母顺序排列

c++ - 使用模板特化选择合适的类型

c++ - 是否可以混淆 RTTI 数据?

linux - 列出按时间排序的文件 key 对

javascript - Angularjs - 简单的 ng-repeat orderBy 过滤器不起作用

matlab - 相对于其字段排序结构 MATLAB

c++ - 使用 seekg() C++ 从文件末尾搜索字符

c++ - 看完归并排序的理论,想写一个归并排序的实现,但是卡住了

C++ 记录每个函数和参数值