我的比较功能出了什么问题?

时间:2019-05-10 23:06:13

标签: c++ sorting

我正在尝试如下对对和整数对的向量进行排序。但是没有得到预期的输出。在实际输出中,最后一个元素应该在第二个元素之前。有人可以解释一下我缺少的内容吗?

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

1 个答案:

答案 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)。换句话说,该函数声称存在值abc,其中a = bb = ca < c。这没有任何意义,因此您的比较功能已损坏。

如果您只想按字典顺序排序,you don't need to do anything special

std::sort(vec.begin(), vec.end());

std::pair首先按其第一部分排序;如果相等,则比较第二部分。这似乎正是您所期望的行为。