【STL——set与multiset容器】

引入

set和multiset是C++ STL中的两种关联容器,基于红黑树(平衡二叉树)实现,用于存储一组有序的元素。两者的主要区别在于元素的唯一性:

set中的元素必须唯一 ,不允许重复。
multiset允许 存储重复的元素。

set

按惯例先添头文件

#include

构造与赋值
cpp 复制代码
	set<int> st;       //默认构造函数

	set<int> st1(st);  //拷贝构造函数
	set<int> st2 = st; //重载等号操作符(也属拷贝构造函数)

	set<int> st3;
	st3 = st2;    //赋值构造函数
插入与删除
cpp 复制代码
void test() {
	set<int> s1;     
	s1.insert(10);
	s1.insert(90);
	s1.insert(30);
	s1.insert(20);
	printSet(s1); //默认顺序输出:10、20、30、90
	s1.erase(s1.begin()); //删除s1的第一个元素(10)
	printSet(s1); //输出:20、30、90
	s1.erase(30); //删除30
	printSet(s1); //输出:20、90
	s1.clear();   //清空
	printSet(s1); //无输出
}
大小与交换
cpp 复制代码
void test() {  
	set<int> s1 = { 10,90,30 }; //简便写法
	printSet(s1); //默认顺序输出:10、30、90
	cout <<"s1现在的大小为:" <<s1.size() << endl; //size=3
	s1.erase(s1.begin()); //删除s1的第一个元素(10)
	printSet(s1); //输出:30、90
	cout << "s1现在的大小为:" << s1.size() << endl; //size=2
	set<int> s2 = { 20,39,48,10 };
	s2.swap(s1);
	printSet(s1); //输出:10、20、39、48
	s1.clear();   //清空
	cout << "s1现在的大小为:" << s1.size() << endl; //size=0
	if (s1.empty()) {
		cout << "s1为空" << endl;
	}
	else {
		cout << "s1不为空" << endl;
	}
	printSet(s1); //无输出
}
查找与统计
cpp 复制代码
void test() {  
	set<int> s1 = { 10,90,30 }; //简便写法
	//set<int>::iterator i=s1.find(90);
	auto i=s1.find(90); //两种写法都可以
	if (i != s1.end()) {
		cout << *i << endl;
	}
	else {
		cout << "未找到该元素" << endl;
	}
	cout <<s1.count(30)<< endl; //30仅有1个,输出1
	s1.insert(30);
	s1.insert(30);
	cout << s1.count(30) << endl; //set不允许有重复元素出现,仍输出1
}

Multiset

Multiset允许存储相同元素,但在使用find()函数返回时返回的是参数匹配的第一个元素的迭代器,即存在多个相同元素时返回第一个。如果没有符合的参数则结束迭代器。

此外,在insert()时还能插入一段数据。

cpp 复制代码
void test() {  
	multiset<int> ms;
	ms.insert(20);
	ms.insert(90);
	ms.insert(10);
	ms.insert(20);
	ms.insert(70);
	printSet(ms); //输出:10、20、20、70、90
	int it = 0;
	for (auto i = ms.begin(); i != ms.find(70); i++, it++) {}
		cout << "发现20的位置在" << it << endl; //输出:3
	
	multiset<int> ms1;
	auto i = ms.begin()++;
	i++;
	ms1.insert(ms.begin(), i); //这里和上篇相同,不能直接给begin做加减
	printSet(ms1); 
}
相关推荐
djarmy25 分钟前
MAIN.c(1): warning C318: can’t open file ‘STC8G.H’ 报错 解决 分析
c语言·开发语言·mongodb
HEJOO91 小时前
深入理解 Java volatile 关键字:原理、用法与常见误区
java·开发语言·spring
曹牧1 小时前
Java:no content to map due to end of input
java·开发语言
梦梦代码精1 小时前
《回收租赁系统技术选型避坑指南:业务闭环与二开自由度详解》
开发语言·低代码·docker·开源·代码规范
隔窗听雨眠1 小时前
记一次SQL Server数据库性能分析:从CPU100%到单配置修复的完整诊断
开发语言·数据库·php
David猪大卫1 小时前
【C++修炼】智能指针使用及原理
开发语言·c++·经验分享·笔记·学习·考研·面试
charlie1145141911 小时前
现代Qt开发之图像处理进阶:像素操作与格式转换
开发语言·图像处理·qt
李永奉1 小时前
中科蓝讯SDK开发-BT893x 面条耳机连接vivo手机后连接APP端,最后手机端设置页面手动断开蓝牙连接,此时耳机端假断开
c语言·开发语言·嵌入式硬件·物联网·智能手机·电脑
零衣贰2 小时前
The 2026 ICPC Asia East Continent Online Contest (I) 题解
c++·icpc
秦老师Q2 小时前
php零基础入门到实战,从语法到框架,一篇搞定
开发语言·php