1、基本概念
关联式容器不同于序列容器,其内部的元素是按照键值和实值的形式存储的,底层结构会按照键值的大小将元素插到相应的位置。关联容器没有头尾的概念,只有最大元素和最小元素。
set就是一种关联容器,其内部使用红黑树作为底层的实现结构。同时,set的元素只有实值,set直接将元素的实值作为元素的键值。
2、查找操作
set查找操作是使用红黑树的查找算法,可以达到很高效的O(logn),查找速度是很快的。
3、插入操作
set插入操作是使用红黑树的插入算法,但是set使用元素的实值作为键值,因而不允许插入相同值的元素。
4、删除操作
set插入操作是使用红黑树的删除算法,删除效率也可到达O(logn)。
5、修改操作
set使用元素的实值作为键值,因而是不允许进行修改的,其内部是将迭代器定义为常量来进行限制的。
6、综合结果
这里,我们对set的基本操作进行简单的测试,测试代码如下:
int list[5] = {0,1,2,3,4};
set<int> a(list, list + 5);
cout<<"size= "<<a.size()<<endl; //size= 5
cout<<"3 count is "<<a.count(3)<<endl; //3 count is 1
a.insert(3);
cout<<"3 count is "<<a.count(3)<<endl; //3 count is 1,不能插入相同的元素
a.insert(5);
cout<<"size= "<<a.size()<<endl; //size= 6
a.erase(1);
cout<<"size= "<<a.size()<<endl; //size= 5
cout<<"set list:";
for (set<int>::iterator iter = a.begin();iter != a.end();++iter)
{
cout<<*iter<<" ";
}
cout<<endl; //set list:0 2 3 4 5
set<int>::iterator temp = a.find(3);
if (temp != a.end())
{
cout<<"find 3 in the set"<<endl; //find 3 in the set
}
//*temp = 9; 编译不过,不能给常量赋值
temp = a.find(1);
if (temp == a.end())
{
cout<<"not find 1 in the set"<<endl; //not find 1 in the set
}
7、性能分析
set依托于红黑树,其基本操作都是直接使用红黑树对应的算法,因而其性能与红黑树是一致的。