持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情
1.1 set和multiset区别
学习目标:
- 掌握set和multiset的区别
1.2 区别:
- set不可以插入重复数据,而multiset可以
- set插入数据的同时会返回插入结果,表示插入是否成功
- multiset不会检测数据,因此可以插入重复数据
1.3 代码示例:
#include <set>
//set和multiset区别
void test01()
{
set<int> s;
pair<set<int>::iterator, bool> ret = s.insert(10);
if (ret.second) {
cout << "第一次插入成功!" << endl;
}
else {
cout << "第一次插入失败!" << endl;
}
ret = s.insert(10);
if (ret.second) {
cout << "第二次插入成功!" << endl;
}
else {
cout << "第二次插入失败!" << endl;
}
//multiset
multiset<int> ms;
ms.insert(10);
ms.insert(10);
for (multiset<int>::iterator it = ms.begin(); it != ms.end(); it++) {
cout << *it << " ";
}
cout << endl;
}
int main() {
test01();
system("pause");
return 0;
}
复制代码
1.4 总结:
- 如果不允许插入重复数据可以利用set
- 如果需要插入重复数据利用multiset
1.5 拓展
-
- set是按照一定次序存储元素的容器
-
- 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素 不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
-
- 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
-
- set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直 接迭代。
-
- set在底层是用二叉搜索树(红黑树)实现的。
注意:
-
- 与map/multimap不同,map/multimap中存储的是真正的键值对,set中只放value,但在底层实际存放的是由构成的键值对。
-
- set中插入元素时,只需要插入value即可,不需要构造键值对。
-
- set中的元素不可以重复(因此可以使用set进行去重)。
-
- 使用set的迭代器遍历set中的元素,可以得到有序序列
-
- set中的元素默认按照小于来比较
-
- set中查找某个元素,时间复杂度为:
-
- set中的元素不允许修改(底层使用二叉搜索树实现的)
-
- set中的底层使用二叉搜索树(红黑树)来实现。