聊聊c++中的set

在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;
}

输出的数据如下:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值