C++ std::需要对具有可比较对象和不可比较对象的配对进行排序

C++ std::需要对具有可比较对象和不可比较对象的配对进行排序,c++,c++11,templates,compiler-errors,C++,C++11,Templates,Compiler Errors,我遇到了以下问题。我有一个std::vectorx类型的std::pair,其中Move是一个没有定义任何比较运算符的任意对象,例如

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

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

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


因为我不想修改原始的
Move
类,所以我编写了一个
包装器
类,该类应该包装
std::pair
,并在其上定义了一个比较操作,这样一个
std::vector>xMove
class,即可对code>进行排序。这里的逻辑是
vector
提供了一个定义了
pair\u mem.first<其他\u pair.first;
}
T对膜;
};
好吧,你可能已经猜到了,上面的方法不起作用,我不得不经历一系列编译器错误。最后,我尝试将
添加到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
作为编译器

更新 我确实将
T
更改为
Wrapper
,这是其中一个答案,但问题没有解决。这是编译器的屏幕截图


如果你最近使用C++编译器,你可以使用lambda:

std::sort(std::begin(x), std::end(x), [](auto & l, auto & r) {return l.first < r.first; });
std::sort(std::begin(x),std::end(x),[](auto&l,auto&r){返回l.first<>代码> 如果你最近使用C++编译器,你可以使用lambda:

std::sort(std::begin(x), std::end(x), [](auto & l, auto & r) {return l.first < r.first; });
std::sort(std::begin(x),std::end(x),[](auto&l,auto&r){返回l.first
您的包装器类应类似于:

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;
};
模板
结构包装器{
包装器(const T&pair):pair_mem(pair){

bool操作符您的包装器类应该类似于:

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;
};
模板
结构包装器{
包装器(const T&pair):pair_mem(pair){

bool操作符当编译器抛出错误时,不要跳过图像中的第一条消息(您确实应该复制文本而不是创建图像):

错误:构造函数
Wraper::Wraper
的实例与参数列表不匹配
向量(大小\u类型\u n,常量值\u类型&\u值=值\u类型()

错误(由下一行的插入符号指示)发生在
value\u type()处
。您在问题中输入的消息不是错误,而是解释编译器试图如何查找缺少的构造函数。它们列出了为
值类型尝试的
结构
,以及找到的构造函数,即采用
T
参数的构造函数。这不匹配,因为iler正在寻找默认构造函数(无参数)

大概在
search-abid_parallel.cpp
的第137行,您使用指定向量初始大小的构造函数声明了包装类的向量。(另外,根据错误消息,pre-C++11?)此构造函数需要能够默认构造这些初始元素。当您定义其他构造函数时,默认构造函数被抑制,因此出现错误

一些选择:

  • 默认情况下,初始化向量,然后调用
    reserve()
    ,以避免在构建向量时重新分配

  • 为包装器类定义默认构造函数

  • 不要使用包装类。相反,为
    std::sort
    (不使用C++20执行策略时的第三个参数)提供一个比较函数

  • 不要使用矢量。
    std::multimap
    将存储您的对并为您排序


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

    错误:构造函数
    Wraper::Wraper
    的实例与参数列表不匹配
    向量(大小\u类型\u n,常量值\u类型&\u值=值\u类型()

    错误(由下一行的插入符号指示)发生在
    value\u type()处
    。您在问题中输入的消息不是错误,而是解释编译器试图如何查找缺少的构造函数。它们列出了为
    值类型尝试的
    结构
    ,以及找到的构造函数,即采用
    T
    参数的构造函数。这不匹配,因为iler正在寻找默认构造函数(无参数)

    大概在
    search-abid_parallel.cpp
    的第137行,您使用指定向量初始大小的构造函数声明了包装类的向量。(另外,根据错误消息,pre-C++