10020set05set和multiset区别

191 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 拓展

    1. set是按照一定次序存储元素的容器
    1. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素 不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
    1. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
    1. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直 接迭代。
    1. set在底层是用二叉搜索树(红黑树)实现的。

注意:

    1. 与map/multimap不同,map/multimap中存储的是真正的键值对,set中只放value,但在底层实际存放的是由构成的键值对。
    1. set中插入元素时,只需要插入value即可,不需要构造键值对。
    1. set中的元素不可以重复(因此可以使用set进行去重)。
    1. 使用set的迭代器遍历set中的元素,可以得到有序序列
    1. set中的元素默认按照小于来比较
    1. set中查找某个元素,时间复杂度为:log2nlog_2 n
    1. set中的元素不允许修改(底层使用二叉搜索树实现的)
    1. set中的底层使用二叉搜索树(红黑树)来实现。