C++ 中set

set特点:

  1. 所有元素不会重复,重复插入已经有的新值无效;
  2. 所有元素按顺序排列;unordered_set除外
  3. 键和值相同,所以set中的值是不可更改的

set的各成员函数列表如下:

1.begin()--返回指向第一个元素的迭代器  // 如果当前容器是空的,就不能解引用(Dereferenced)返回的迭代器值。

2. clear()--清除所有元素

3. count()--返回某个值元素的个数    //    set.count(x)--返回x元素的个数,注意:由于set内元素不能重复,所以此处count的结果只能是0(没有)或者1(有且仅有一个

4. empty()--如果集合为空,返回true //用迭代器之前需要验证是否为空

5. end()--返回指向最后一个元素的迭代器

6. equal_range()--返回集合中与给定值相等的上下限的两个迭代器

7. erase()--删除集合中的元素

8. find()--返回一个指向被查找到元素的迭代器   // set.find(x)--返回x元素的迭代器,即该节点的指针;没找到返回set.end()  

9. get_allocator()--返回集合的分配器

10. insert()--在集合中插入元素  // 还有一个与之类似的函数:emplace. 之间的区别:添加新元素的时候调用的构造函数不同。

11. lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器

12. key_comp()--返回一个用于元素间值比较的函数

13. max_size()--返回集合能容纳的元素的最大限值

14. rbegin()--返回指向集合中最后一个元素的反向迭代器

15. rend()--返回指向集合中第一个元素的反向迭代器

16. size()--集合中元素的数目

17. swap()--交换两个集合变量

18. upper_bound()--返回大于某个值元素的迭代器

19. value_comp()--返回一个用于比较元素间的值的函数

 

和vector、list不同,set、map都是关联式容器。set内部是基于红黑树实现的。插入和删除操作效率较高,因为只需要修改相关指针而不用进行数据的移动。

在进行数据删除操作后,迭代器会不会失效呢?删除set的数据时,实际的操作是删除红黑树中的一个节点,然后相关指针做相关调整。指向其他元素的迭代器还是指向原位置,并没有改变,所以删除一个节点后其他迭代器不会失效。list和map也是同样的道理。然而删除vector中的某个元素,vector中其他迭代器会失效,因为vector是基于数组的,删除一个元素后,后面的元素会往前移动,所以指向后面元素的迭代器会失效。 

再稍微说一下迭代器的实现。迭代器是一个对象,vector的迭代器是封装了数组下标list、map、set的迭代器是封装了元素节点的指针。 
还有一点,从数学层面,set的一个集合,好比一个袋子里面装了好多个小球。但是红黑树是一种特殊的二叉搜索树,set中的元素根据其值的大小在红黑树中有特定的位置,是不可移动的。所以,1是search操作效率会很高O(log n),2是set中元素的值不可改变。

 

 

 

参考文章:

http://classfoo.com/ccby/article/w2pUE

https://blog.csdn.net/u010902721/article/details/45771597

https://www.cnblogs.com/omelet/p/6627667.html

https://blog.csdn.net/qq826647235/article/details/53741372

 

原文链接: https://www.cnblogs.com/xiaoxue126/p/8984760.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    C++ 中set

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/273261

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 下午11:28
下一篇 2023年2月14日 下午11:28

相关推荐