set/multiset容器概念
- set和multiset是一个集合容器,其中set所包含的元素是唯一的,集合中的元素按一定的顺序排列。
- set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。在n个数中查找目标数的效率是 log2 n
- 红黑树定义 — 是每个节点都带有颜色属性(颜色为红色或黑色)的自平衡二叉查找树,满足下列性质:
1)节点是红色或黑色;
2)根节点是黑色;
3)所有叶子节点都是黑色节点(NULL);
4)每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节点。)
5)从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。
Set 和 multiset 特点
- set中元素插入过程是按排序规则插入,所以不能指定插入位置。
- set不可以直接存取元素。(不可以使用at.(pos)与[]操作符)。
- multiset与set的区别:set支持唯一键值,每个元素值只能出现一次;而multiset中同一值可以出现多次。
- 不可以直接修改set或multiset容器中的元素值,因为该类容器是自动排序的。如果希望修改一个元素值,必须先删除原有的元素,再插入新的元素
- 头文件 #include < set>
//set不支持插入相同元素
set<int> s1;
for (int i = 0; i < 5; i++) {
s1.insert(100 - i);
}
s1.insert(99); //插入相同元素
for (auto it = s1.begin(); it != s1.end(); it++) {
cout << *it << endl; //输出 96 97 98 99 100
}
//multiset支持插入多个相同元素
multiset<int> m1;
for (int i = 0; i < 5; i++) {
m1.insert(100 - i);
}
m1.insert(99); //插入相同元素
for (auto it = m1.begin(); it != m1.end(); it++) {
cout << *it << endl; //输出 96 97 98 99 99 100
}
set/multiset对象的默认构造
set<int> setInt; //一个存放int的set容器。
set<float> setFloat; //一个存放float的set容器。
set<string> setString; //一个存放string的set容器。
multiset<int> mulsetInt; //一个存放int的multi set容器。
multiset<float> multisetFloat; //一个存放float的multi set容器。
multiset<string> multisetString; //一个存放string的multi set容器。
Set/multiset 对象的带参构造函数
set