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>x无需修改Move
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++