欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c++中set的介绍及用法

程序员文章站 2022-06-20 21:02:58
...

set的简单介绍

set关联式容器;set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。set的内部采用的是一种非常高效的平衡检索二叉树:红黑树,也称为RB树(Red-Black Tree)。RB树的统计性能要好于一般平衡二叉树,所以被STL选择作为了关联容器的内部结构。

  1. set的插入和删除效率非常高,因为set内部采用链表结构,插入以及删除只需要修改指针,不涉及内存的操作;
  2. 当数据元素增多时,set的插入和搜索速度变化不大,在set中查找是使用二分查找,也就是说,如果有16个元素,最多需要比较4次就能找到结果,有32个元素,最多比较5次。其时间复杂度为log2n\log_2n

set中常用的方法

  1. begin(); 返回set容器的第一个元素,其中反向遍历用rbegin()
  2. end(); 返回set容器的最后一个元素,其中反向遍历用rend()
  3. clear(); 删除set容器中的所有的元素
  4. empty(); 判断set容器是否为空
  5. max_size(); 返回set容器可能包含的元素最大个数
  6. size(); 返回当前set容器中的元素个数
    Tip: 需要注意的是begin()end()函数是不检查set是否为空的,使用前最好使用empty()检验一下set是否为空.
  7. count(); 用来查找set中某个某个键值出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。
  8. erase(iterator); 删除定位器iterator指向的值
  9. erase(first,second); 删除定位器first和second之间的值
  10. erase(key_value); 删除键值key_value的值
  11. insert(key_value); 插入元素

常用操作代码

  1. 插入元素
    set<int> s;
    for(int i=1; i<=10; i++){
        s.insert(i);
    }
    
  2. 正向遍历
    for(set<int>::iterator it=s.begin(); it!=s.end(); it++){
        cout<<*it<<endl;
    }
    
  3. 反向遍历
    for(set<int>::reverse_iterator it=s.rbegin(); it!=s.rend(); it++){
        cout<<*it<<endl;
    }
    
  4. 删除元素
    s.erase(5);    //删除值为5的元素
    s.erase(s.begin());    //删除第一个元素
    s.erase(s.end());    //删除最后一个元素
    s.erase(first_iterator,second_iterator);    //删除两个迭代器之间的值
    //例如
    s.erase(s.begin(), s.end());    //删除所有元素
    
  5. 元素检索:
    set<int> s;
    for(int i=1; i<=10; i++){
        s.insert(i);
    }
    cout<<*s.find(5)<<endl;
    // 注意返回的并不是下标,因为没有set不是数组,返回的是迭代器,及对应值为value的指针
    
相关标签: 源码解析