0

说我有

std::set<classtype> set;
class classtype {
    bool operator==(const classtype& ct) {
        //..
    } 
};
//..
std::set<classtype>::iterator it = set.find(element);

Find 确实使用了类中的 == 运算符,对吗?

我的参考资料还说它有 log(n) 最坏情况运行时,其中 n 是集合中元素的数量。这在内部是如何实现的?我知道关键是集合中的元素有一个顺序(因此插入需要很长时间才能创建该顺序),对于整数集来说,顺序意味着什么很清楚,但对于随机类来说不是那么多。

4

1 回答 1

4

来自 C++ 标准(23.2.4 关联容器)

3 短语“键的等价”是指比较强加的等价关系,而不是键上的运算符==。也就是说,如果对于比较对象 comp,comp(k1, k2) == false && comp(k2, k1) == false,则认为两个键 k1 和 k2 是等效的。对于同一容器中的任意两个键 k1 和 k2,调用 comp(k1, k2) 应始终返回相同的值。

成员函数find根据比较对象寻找keycomp

如果您没有明确指定比较对象,则该类默认std::less使用operator <在其运算符函数中使用的标准功能对象。所以你的班级必须有运算符 < 定义。

如果要operator ==用于集合中的比较值,则可以使用标准算法std::find而不是方法find

于 2015-06-24T19:36:07.593 回答