在java中,存放不同元素的容器是set,元素是否相同使用equals方法和hashCode方法来定义。
假如要给set中存放自定义类,那么就得实现equals方法和hashCode方法。
在c++中也有c++,用来存放不同的元素,天真的我也就直接使用了set,并且重载了==运算符
结果发现,里面是有问题。
c++中的set有两种,分别是
c++中的std::set,是基于红黑树的平衡二叉树的数据结构实现的一种容器,因为其中所包含的元素的值是唯一的,查找的时间复杂度是O(log2N)
unordered_set的实现方式为哈希函数,所以无序关联容器不会根据key值对存储的元素进行排序,查找的时间复杂度是O(1)
所以简单的来说,使用有序set,你得重载小于号
里面你只要记住两点,如果两个元素相等,就返回false
如果两个元素不相等,那么就得指定一个不会矛盾的比较方法。
参见:https://www.cnblogs.com/litaozijin/p/6665595.html
使用无序set,那就和java类似了。
第一重载==运算符
第二自定义hash函数
参见:C++ 无序关联容器_c++无序关联式容器-CSDN博客
其实如果单纯的只是想存放一堆不同的元素,在c++中应该使用unordered_set。
我之前的问题是知道java中有个set,相同的需求就直接用了c++中的set。
另外unordered_set是c++11才出来的。
具体来说c++中的set更近似于java中的TreeSet,我们看一段代码:
#include<iostream>
#include<set>
int main() {
//生成待处理的数据
std::set<int> all;
all.insert(5);
all.insert(7);
all.insert(1);
//遍历set,用迭代器类型
for (auto i = all.begin(); i != all.end(); i++) {
std::cout << *i << std::endl; //注意指针运算符
}
return 0;
}
输出的数据如下: