C++ STL之Set

2019/03/06 16:15
阅读数 158

set是关联容器,类似于集合。

特点是里面的元素不会重复,而且元素时有序的。

1.声明定义:

#include<set>

using namespace std;

set<int> s;

2.常见用法

s.inert(5); //插入
s.begin();  //返回s的第一个元素 

s.end(); // 返回最后一个元素

s.clear() ; //清空

s.empty(); //判断是否为空

s.max_size() //返回最可能包含的元素最大个数

s.size();        //返回当前元素的个数

s.rbegin();     //同end()

s.rend();       // 同begin()

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

s.erase();          //删除集合中的元素

s.lower_bound  //返回大于或等于某值的第一个元素迭代器

s.key_comp();   //返回一个用于中间值比较的函数

s.upper_bound  //返回大于的第一个元素迭代器

3.自定义比较函数

1)元素不是结构体:(自定义比较函数myComp,重载“()”操作符)

struct myComp{
   bool operator() (const your_type &a,const your_type &b){
   return a.data - b.data > 0;
   }
}

2)如果元素是结构体

struct Info{
   string name;
   int score;
   bool operator<const Info &a) const{
   return a.score < score;
   }
}

---------------------------------------------------------------------------------------------

补充:

C++容器分为顺序容器和关联性容器:

    顺序容器包括vector、deque、list、forward_list、array、string,所有顺序容器都提供了快速顺序访问元素的能力。

    关联容器包括set、map的关联型容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的。

    关联容器不支持顺序容器的位置相关的操作。原因是关联容器中元素是根据关键字存储的,这些操作对关联容器没有意义。

而且,关联容器也不支持构造函数或插入操作这些接受一个元素值和一个数量值得操作。

    关联容器支持高效的关键字查找和访问

    map中的元素是一些关键字----值(key--value)对:关键字起到索引的作用,值则表示与索引相关联的数据。

    set中每个元素只包含一个关键字:set支持高效的关键字查询操作----检查一个给定关键字是否在set中。

    set封装的二叉树,所以它支持插入数据的排序,它是关联式容器,存储同一数据类型,set中的每一个元素都是唯一的,系统会根据元素的值自动进行排序。

    它们内部采用的是平衡检索二叉树:红黑树,它的统计性能要好于一般的平衡二叉树。

1)map和set的插入删除效率要比其他序列容器高

    对于关联容器来说,不需要内存拷贝和移动。

    set容器所有元素都是以节点的方式来存储,节点结构和链表相似,指向父节点和子节点。插入和删除的时候改变的都是指针,不会移动内存。

2)每次insert之后,以前保存的iterator不会失效。

    iterator等价于指向节点的指针,其内存没有发生变化,指向内存的指针也不会出现失效的情况。

    对于vector来说,每一次插入和删除都有可能使指针失效,即使在尾部插入也是 如此。

    这是因为为了保证内部数据的连续存放,iterator指向的那块内存在删除和插入的过程可能已经被其他内存覆盖和释放了。

    即使是用push_back的时候,容器的存储空间可能不够,需要一块更大的内存。

    只有把以前的内存释放掉,申请更大的内存,复制已有的数据元素到新的内存,最后把需要插入的元素放到最后。

   那么以前的内存指针必然不可再用了。

3)当元素增多的时候,set的插入和搜索速度变化是不变的。   红黑树的查找时间复杂度都是logN。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

未完待续

 

展开阅读全文
c++
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部