具有可比较对象和不可比较对象的std :: pair需要排序

时间:2018-06-26 21:44:53

标签: c++ c++11 templates compiler-errors

我遇到了以下问题。我有一个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>并在其上定义了一个比较操作,以使{{ 1}}可以排序,而无需修改std::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; }; 添加到Move类中,即使在那之后我仍然无法编译程序。

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

< operator

我正在使用: 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更改为T,但问题仍未解决。这是编译器的屏幕截图,

enter image description here

3 个答案:

答案 0 :(得分:3)

您的包装器类应类似于:

JiraCustomField

Demo

但是使用自定义比较器似乎更好(干扰较小)。

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;
};

答案 1 :(得分:1)

如果最近使用的是c ++编译器,则可以使用lambda:

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

答案 2 :(得分:1)

当编译器吐出错误时,不要跳过第一条消息。从图像中(您确实应该复制了文本而不是创建图像):

  

错误:没有构造函数Wraper<T>::Wraper的实例与参数列表匹配   vector(size_type __n, const value_type& __value = value_type()

错误(在下一行由插入号指示)发生在value_type()。您输入到问题中的消息不是错误,而是解释了编译器为查找缺少的构造函数而尝试执行的操作。他们列出了为struct尝试过的value_type和找到的构造函数,它们采用了T参数。这不匹配,因为编译器正在寻找默认构造函数(无参数)。

大概是在search-abid_parallel.cpp的第137行,您使用指定向量初始大小的构造函数来声明包装类的向量。 (此外,基于错误消息,C ++ 11之前的版本?)此构造函数需要能够默认构造那些初始元素。定义其他构造函数时,默认构造函数被取消显示,因此会出现错误。

一些选项:

  1. 默认初始化向量,如果要在构建向量时避免重新分配,请调用reserve()

  2. 为包装器类定义默认的构造函数。

  3. 不要使用包装器类。而是给std::sort(不使用C ++ 20执行策略时的第三个参数)提供比较功能。

  4. 不要使用向量。 std::multimap将存储您的货币对并为您排序。