关于#c++#的问题:C++中set容器,利用仿函数改变排序规则

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

img


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

这证明我们成功地更改了排序规则,并且插入操作不再出现错误。

希望这个解决方案对你有帮助!如果你有任何其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^