首页 > 解决方案 > 需要对具有可比较对象和不可比较对象的 std::pair 进行排序

问题描述

我遇到了以下问题。我有一个std::vector< std::pair<int, Move> > x类型std::pair<int, Move>,其中Move是一个没有定义任何比较运算符的任意对象,例如< > !+ == <= >=等等。

Move我将对象与整数值配对的主要原因是Move对象应该有一个数字来描述它们出于某种目的的优先级。主要目的是对向量进行排序,从而Move使用它们各自的整数值对对象进行排序。

当我想使用std::sort函数对向量中的这些对进行排序时,真正的问题就开始了。最初我认为只有第一个元素std::pair对比较很重要,然而,事实证明这两个对象都需要为它们定义比较操作才能成功编译程序。

由于我不想修改原始Move类,所以我编写了一个Wrapper应该包装的类std::pair<int, Move>并在其上定义了一个比较操作,这样就可以对 astd::vector< Wrapper < std::pair<int, Move> > > x;进行排序而无需修改Move类。这里的逻辑vector是提供了一个<定义了操作的类。

我使用了以下包装类:

template <typename T>
struct Wrapper{
    Wrapper(const T & pair): pair_mem(pair)
    bool operator(const T & other_pair) const{
          return this->pair_mem.first < other_pair.first;
    }
    T pair_mem;
};

好吧,您可能已经猜到上面的方法不起作用,我不得不经历一堆编译器错误。最后,我尝试添加< operator到 Move 类,即使在那之后我也无法编译程序。

以下是我认为最重要的错误。

: note: this candidate was rejected because mismatch in count of arguments
    struct Wraper{
           ^
: note: this candidate was rejected because mismatch in count of arguments
            Wraper(const std::pair<int, Move> & move){

mpiCC用作编译器

更新

我确实按照建议的答案之一更改TWrapper,但问题没有解决。这是编译器的屏幕截图,

在此处输入图像描述

标签: c++c++11templatescompiler-errors

解决方案


您的包装类应类似于:

template <typename T>
struct Wrapper{
    Wrapper(const T & pair): pair_mem(pair) {}
    bool operator <(const Wrapper& rhs) const {
        return pair_mem.first < rhs.pair_mem.first;
    }
    T pair_mem;
};

演示

但是使用自定义比较器似乎更好(侵入性较小)。

std::sort(x.begin(), x.end(),
          [](const auto& lhs, const auto& rhs) {
              return lhs.first < rhs.first;
          });

推荐阅读