【问题标题】:c++ Overloaded operator () change std::set.find()c++ 重载运算符 () 更改 std::set.find()
【发布时间】:2023-01-27 15:58:04
【问题描述】:

我正在学习 std::set 。这是我的代码:

#include <set>
#include <iostream>
using namespace std;
struct cmp{
    bool operator () (const int & a,const int & b) const {
        if(abs(a-b)<=3)
            return false;
        return a < b;
    }
};
set<int,cmp> q{1, 2, 10};
int main(){
    if(q.find(4)!=q.end())
        cout << 1;
    else
        cout << 2;
}

输出:1

我使用 struct cmp 来自定义元素的排序规则,如果 abs(a-b)<=3 新元素将被删除。

但是令我惊讶的是 q.find() 已经被改变了。

我想知道为什么输出是1,q中没有4。

q.find(4)是获取元素等于的迭代器 4 在 q 中,不是吗?

【问题讨论】:

  • 4、1 和 2 与您的比较器相同。 find() 确实找到了 4,如果找到一个等于 4 的元素。

标签: c++ stl


【解决方案1】:

输出为 1 因为您的自定义比较器函数不仅用于对集合中的元素进行排序,而且还用于确定元素之间的相等性。换句话说,find 函数使用比较器来确定元素是否等于您要搜索的值(在本例中为 4)。

find 函数遇到集合中的元素 1 时,它会使用您的自定义比较器函数将其与 4 进行比较。在您的比较器函数中,abs(1-4) &lt;= 3 为真,因此该函数返回假。这导致 find 函数认为 1 和 4 相等,因此它返回一个指向 1 的迭代器。

要解决这个问题,您应该确保您的比较器函数只比较元素的相对顺序,而不是它们的相等性。这可以通过在比较器函数中添加单独的相等性检查,或使用不同的容器来完成,例如 std::unordered_set,它使用 == 运算符来检查元素的相等性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    相关资源
    最近更新 更多