C++中set容器,利用仿函数改变排序规则,insert报错
In template: static assertion failed due to requirement 'is_invocable_v<const MyCompare &, const int &, const int &>': comparison object must be invocable as const error occurred here in instantiation of member function 'std::_Rb_tree<int, int, std::_Identity, MyCompare>::_S_key' requested here in instantiation of member function 'std::_Rb_tree<int, int, std::_Identity, MyCompare>::_M_get_insert_unique_pos' requested here in instantiation of function template specialization 'std::_Rb_tree<int, int, std::_Identity, MyCompare>::_M_insert_unique' requested here in instantiation of member function 'std::set<int, MyCompare>::insert' requested here
class MyCompare
{
public:
bool operator()(const int& v1, const int& v2) const
{
return v1 > v2;
}
};
【以下回答由 GPT 生成】
回答:
这个错误是由于仿函数在比较对象时没有被标记为const引起的。为了解决这个问题,你需要在仿函数类中将operator()函数标记为const成员函数。
下面是一个示例代码,演示了如何修复这个问题:
#include <iostream>
#include <set>
// 仿函数类
struct MyCompare {
bool operator()(const int& a, const int& b) const {
return a > b; // 这里改变了排序规则,按降序排序
}
};
int main() {
// 使用set容器,指定自定义的排序规则
std::set<int, MyCompare> s;
// 插入元素
s.insert(5);
s.insert(2);
s.insert(7);
// 输出set容器中的元素
for (const auto& num : s) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
这段代码中,我们定义了一个MyCompare仿函数类,重载了operator()函数,并将它标记为const成员函数。然后在创建set容器时,指定了我们自定义的排序规则。
运行这段代码,你将会得到以下输出:
7 5 2
这证明我们成功地更改了排序规则,并且插入操作不再出现错误。
希望这个解决方案对你有帮助!如果你有任何其他问题,请随时提问。