【问题标题】:What is wrong with my comparison function?我的比较功能有什么问题?
【发布时间】:2019-05-10 23:06:12
【问题描述】:

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

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

【问题讨论】:

    标签: c++ sorting


    【解决方案1】:

    你还没有解释你想如何对你的三元组进行排序,所以我只能说你的期望是错误的。

    您的比较函数认为您的最后三个元素相等。

    如果x0 &lt; y0x1 &lt; y1,则认为三元组(x0,x1,x2) 小于另一个三元组(y0,y1,y2)。例如,比较(6,4,7)(6,5,4) 时,没有一个三元组被认为小于另一个,因为每个三元组中的第一个数字相同(6 &lt; 6 为假)。同样,(5,4,6) 被认为等于 (6,4,7),因为两者都不小于另一个(4 &lt; 4 为假)。

    您唯一可以合理预期的是(5,4,6) &lt; (6,5,4),但您的比较函数也表明这两者都等于(6,4,7)。换句话说,该函数声称有值abc,其中a = bb = ca &lt; c。这没有任何意义,因此您的比较功能已损坏。

    如果你想要的只是一个字典顺序,you don't need to do anything special:

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

    std::pair 首先按其第一个组件排序;如果它们相等,它会比较第二个组件。这似乎正是您所期望的行为。

    【讨论】:

    • 感谢 melpomene,我错过了强弱排序的不可比性的传递性。我的比较函数没有统计它。link
    猜你喜欢
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 2015-05-27
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多