c++ - 需要对具有可比较对象和不可比较对象的 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
用作编译器
更新
我确实按照建议的答案之一更改T
为Wrapper
,但问题没有解决。这是编译器的屏幕截图,
解决方案
您的包装类应类似于:
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;
});
推荐阅读
- java - 适用于 Windows 的 OpenJDK8
- android - 如何喜欢/不喜欢和订阅 Android 应用中的 YouTube 视频
- c - 为什么我的 cygwin GSL 安装中缺少 GSL_SUCCESS 和 GSL_CONTINUE?
- powershell - 如何使用powershell函数返回期望值?
- powershell - 删除具有名字和姓氏的批量用户
- ios - 在 Objective C 中看不到 Swift 变量/方法
- java - 如何使用java apache poi遍历excel工作表中某一列的值以获取值的索引
- angular - Angular.json 构建选项
- jquery - 当它的 ArrayOfString 时将 JSON 响应格式化为一个表
- java - DST 偏移量在我的开发服务器中不起作用