重载运算符<在排序中未使用对
overloaded operator< on pair not being used in sort
我重载了pair<int,int>
的小于运算,这样我就可以以特定的方式对向量进行排序。我希望它根据一对中的第一个键按升序排列,如果第一个键相等,那么我希望它按照第二个键按降序排列。
问题是排序函数似乎没有使用重载的<
运算符,但如果在2对上调用<
,则返回的输出就是我所期望的。我在下面附上了一段代码,我正在使用它进行测试:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool operator<(pair<int, int> &a, pair<int, int> &b)
{
if (a.first < b.first) return true;
else if ((a.first == b.first) && (a.second > b.second)) return true;
return false;
}
int main() {
vector<pair<int, int>> test {make_pair(1,10), make_pair(3,4), make_pair(3,8), make_pair(6, 23), make_pair(1,6)};
sort(test.begin(), test.end());
for (int i = 0; i < test.size(); i++)
cout << test[i].first << " - " << test[i].second << " ";
cout << endl;
auto a = make_pair(3,4);
auto b = make_pair(3,8);
cout << (a < b) << endl;
return 0;
}
输入矢量为{(1,10), (3,4), (3,8), (6,23), (1,6)}
。
我希望输出为{(1,10), (1,6), (3,8), (3,4), (6,23)}
。
获得的输出为{(1,6), (1,10), (3,4), (3,8), (6, 23)}
。
正如您所看到的,所获得的输出是在不重载的情况下使用标准<
运算符所获得的。所以我认为这可能是一个问题,并检查了(3,4) < (3,8)
。在这种情况下,根据我的重载运算符,答案被返回为false。那么我哪里错了?为什么sort
没有受到过载操作员的影响?SO上有关于类似问题的各种问题,但找不到任何有帮助的问题。
在std
命名空间中已经为对定义了一个operator<
,这就是您正在使用的std::sort
版本所找到的。您的过载永远找不到。请改用命名谓词:
struct MyPairComparator
{
bool operator()(const std::pair<int, int> & a,
const std::pair<int, int> & b) const
{
// ...
}
};
sort(test.begin(), test.end(), MyPairComparator()); // ADL, maybe
// ^^^^^^^^^^^^^^^^^^
此外,谓词应该可以用常量值调用,因此可以按值或按常量引用获取参数。
请注意,sort
位于std
命名空间中。相比之下,当您在main
中使用<
表达式时,确实会在全局命名空间中找到您自己的重载。
您似乎使用了C++11编译器,请更正并简化lambda函数的使用。类似的东西
sort(test.begin(), test.end(), [](const pair<int, int> & a, const pair<int, int> & b) {
if (a.first < b.first) return true;
else if ((a.first == b.first) && (a.second > b.second)) return true;
return false;
});
相关文章:
- 普通环路未使用gcc 4.8.5自动矢量化
- 在更改for循环的第三部分后,未使用for循环结果
- 使用typeid警告未使用的变量
- C++删除未使用的类属性会导致 std::logic_error
- 警告 C4552:">>":未使用表达式的结果
- (SFML)按下键时,播放器构造函数未使用正确的动画进行更新
- 气泡排序未正确循环
- 为什么我会收到警告,指出函数已使用但未定义,以及已定义但未使用?
- 如果我想链接静态库并删除未使用的符号.txt我应该如何处理 Cmakelist
- 可视化C++载体:未使用的容量
- 在气泡排序中使用递归
- GCC 中 __attribute__((未使用)) 和 __attribute((未使用)) 之间的区别
- 循环访问还包含未使用元素的字符串数组
- Q维德格特关闭事件(..)未使用 QProcess::terminate() 调用
- Visual Studio "fatal error LNK1104: cannot open file"未使用或包含的库
- G++ 编译器是否在未使用返回值的情况下将 constexpr 函数视为常规函数?
- 链接器输入文件未使用,因为链接未完成,我无法获得.o
- 未使用的C++未优化的静态成员函数/变量
- 在C++11中,未排序的修改警告变为结果未使用的警告
- 重载运算符<在排序中未使用对