【C++中STL】set/multiset容器

本文详细介绍了C++中的set和multiset容器的基本概念,包括它们的构造、赋值、大小、交换、插入、删除、查找功能,以及两者之间的主要区别。同时探讨了如何对容器进行排序,包括内置类型和自定义类型的排序方法。
摘要由CSDN通过智能技术生成

Set基本概念

所有元素都会在插入时自动被排序。
set/multist容器属于关联式容器,底层结构属于二叉树。
set不允许容器中有重复的元素,multiset允许容器中有重复的元素。

set构造和赋值

1、set<T> st;默认构造函数
2、set(const set &st);拷贝构造函数
3、set& operator=(const set &st);赋值

void test1() {
	set<int> st;
	st.insert(10);
	st.insert(40);
	st.insert(30);
	st.insert(1);
	st.insert(30);
	p(st);
	set<int> s2(st);
	p(s2);
	set<int> s3;
	s3= s2;
	p(s3);
}

在这里插入图片描述

set的大小和交换

1、empty();判断容器是否为空
2、size();返回容器中元素的个数
3、swap(st);交换两个集合容器

void test1() {
	...
	if (!st.empty()) {
		cout << "大小" << st.size()<<endl;
	}
	set<int> s2;
	s2.insert(32);
	s2.insert(23);
	s2.insert(43);
	st.swap(s2);
	p(st);
}

set的插入和删除

1、insert(elem);插入,只有这一种方法
2、clear();清空所有元素
3、erase(pos);删除pos位置的元素,返回下一个数据的位置
4、erase(beg,end);删除迭代器从beg到end之间的元素,返回下一个数据的位置
5、erase(elem);删除容器中值为elem的元素

void test1() {
...
	st.erase(st.begin());
	st.erase(++st.begin(), --st.end());
	p(st);
	st.erase(10);
	p(st);
	st.clear();
	p(st);
}

在这里插入图片描述

set查找和统计

1、find(key);查找key是否存在,若存在,返回该键的元素的迭代器,若不存在,返回set.end()
2、count(key);统计key的元素个数

void test1() {
	...
	set<int>::iterator pos=st.find(40);
	if (pos != st.end()) {
		cout << "找到:" <<*pos<< endl;
	}
	else {
		cout << "没找到" << endl;
	}
	cout << st.count(30) << endl;//统计的结果式0或1
}

在这里插入图片描述

set和multiset的区别

1、set不可以插入重复数据,multiset可以
2、set插入数据的同时会返回插入结果,表示插入成功
3、multiset不会监测数据,因此可以插入重复数据

void test1() {
	set<int> st;
	pair<set<int>::iterator, bool> ret = st.insert(30);
	if (ret.second) {
		cout << "第一次插入成功" << endl;
	}
	else {
		cout << "第一次插入失败" << endl;
	}
	ret=st.insert(30);
	if (ret.second) {
		cout << "第二次插入成功" << endl;
	}
	else {
		cout << "第二次插入失败" << endl;
	}
}

在这里插入图片描述

	m.insert(10);//直接插入不会检测
	m.insert(10);
	for (multiset<int>::const_iterator it = m.begin();it != m.end();it++) {

		cout << (*it) << "   ";
	}
	cout << endl;

在这里插入图片描述
返回是一个对组
在这里插入图片描述
在这里插入图片描述

multiset插入返回的是一个迭代器
在这里插入图片描述

pair对组

两种创建方式

1、pair<type,type> p(value1,value2);
2、pair<type,type> p=make_pair(value1,value2);

void test() {
	pair<string, int>p("Tom", 20);
	cout << "姓名:" << p.first << "年龄:" << p.second << endl;
	pair<string, int>p1=make_pair("Ala", 23);
	cout << "姓名:" << p1.first << "年龄:" << p1.second << endl;
}

set容器排序

在使用仿函数排序时,需要加const不可修改,不然会报错,set的排序规则下定义是需要设置好,默认是升序。

class S {
public:
	int age;
	string name;
	int h;
	S(string _n, int _a,int _h) {
		name = _n;
		age = _a;
		h = _h;
	}
};
class compareS {
public:
	bool operator()(S v1, S v2) const{
		return v1.age > v2.age;
	}
};
class MyCompare {
public:
	bool operator()( int v1, int v2)const {
		return v1 > v2;
	}
};
//内置类型排序
void test1() {
	//指定排序规则为大到小
	set<int,MyCompare> s2;
	s2.insert(10);
	s2.insert(40);
	s2.insert(30);
	s2.insert(1);
	s2.insert(30);
	for (set<int,MyCompare>::iterator it = s2.begin();it != s2.end();it++) {
		cout << (*it) << "   ";
	}
}
//自定义类型排序
void test() {
	set<S, compareS> s;
	S s1("Tom", 18, 187);
	S s2("Lisa", 20, 165);
	S s3("LuJy", 34, 190);
	S s4("Tony", 21, 167);
	S s5("Ala", 20, 168);
	s.insert(s1);
	s.insert(s2);
	s.insert(s3);
	s.insert(s4);
	s.insert(s5);
	for (set<S, compareS>::iterator it = s.begin();it != s.end();it++) {
		cout << "姓名:" << (*it).name << "\t年龄:" << (*it).age << "\t身高:" << (*it).h << endl;
	}
}
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值