关联式容器:
set和map的底层实现都是RB-tree又称红黑树,而set和map又都是关联式容器,所谓关联式容器,就是每个元素都有一个key和一个value,而对于set来说,它的key就是它的value。所以set不允许两个元素有相同的key,所有元素都会根据key值自动被排序。
迭代器指向的值不允许被修改,因为set容器中的值都是关联起来的,如果改变某一处的值,也许会改变整个布局,所以改变迭代器指针处的值不被允许。
示例程序:
#include"Test.h" #include<set> #include<algorithm>//为了使用find、sort等方法 void main() { setlocale(LC_ALL, "chs");//识别中文 set<int> v1; v1.insert(2); v1.insert(6); v1.insert(5); v1.insert(3); v1.insert(7); v1.insert(4);//插入自动排序 v1.insert(4);//自动去重 int v7 = v1.count(4);//这个值要么1,要么0 v1.erase(5);//直接删除元素 v1.erase(v1.find(6));//删除迭代器所在位置的元素 set<int>::iterator v2 = v1.find(2); //*v2 = 4; 表达式必须是可修改的左值 for (set<int>::iterator v3 = v1.begin(); v3 != v1.end(); v3++) { cout << *v3 << endl; } v1.clear(); getchar(); }
不管你以什么样的顺序插入,它内部都会自动按照升序排列。
我们还会见到multiset这个STL,那它又是什么意思呢?
multiset的特性以及用法与set完全相同,只不过是它允许key重复。
简单修改:
void main() { setlocale(LC_ALL, "chs");//识别中文 multiset<int> v1; v1.insert(2); v1.insert(6); v1.insert(5); v1.insert(3); v1.insert(7); v1.insert(4);//插入自动排序 v1.insert(4);//不会自动去重 int v7 = v1.count(4);//这个时候,它就有可能大于1了 v1.erase(5);//直接删除元素 v1.erase(v1.find(6));//删除迭代器所在位置的元素 set<int>::iterator v2 = v1.find(2); //*v2 = 4; 表达式必须是可修改的左值 for (set<int>::iterator v3 = v1.begin(); v3 != v1.end(); v3++) { cout << *v3 << endl; } v1.clear(); getchar(); }
“Don’t let fear stop you from doing the thing you love.”
参考书籍:
《STL源码剖析》