C++常用STL容器--set/multiset

7 篇文章 0 订阅

基本概念

特点: 所有元素都会在插入时自动被排序

本质: set/multiset属于关联式容器,底层结构用二叉树实现

set和multiset区别

  • set不允许容器中有重复的元素,multiset允许容器中有重复的元素
  • set插入数据的同时会返回插入结果,表示插入是否成功
  • multiset不会检测数据,因此可以插入重复数据

set构造、赋值

函数原型

构造:

  • set<T> st; //默认构造
  • set(const set &st); //拷贝构造

赋值:

  • = //重载等号操作符

set 大小、交换

函数原型

  • .size();//返回容器中元素的数目
  • .empty();//判断容器是否为空
  • .swap(st);//交换两个set容器

set插入、删除

函数原型

插入:

  • .insert(elem);//插入值为elem的元素

删除:

  • .clear();//清除所有元素
  • .erase(pos);//删除指定pos位置的元素,返回下一个元素的迭代器
  • .erase(beg,end);//删除区间【beg,end)中的数据,返回下一个元素的迭代器
  • .erase(elem);//删除值为elem的元素

set查找、统计

函数原型

  • .find(key);//查找key值是否存在,若存在,返回该值的元素的迭代器;若不存在,返回.end()
  • .count(key);//统计key的元素个数,set容器结果只有0或1,multiset可以有不同的值

set容器排序

set容器默认排序规则为从小到大,可以利用仿函数来改变排序规则

示例一 set存放内置数据类型

//仿函数,指定排序规则为从大到小
class MyCompare
{
public:
	bool operator()(int v1, int v2) const{
		return v1 > v2;
	}
};

set<int, MyCompare>s2;	//传入自定义的仿函数,实现自定义排序
s2.insert(10);
s2.insert(30);
s2.insert(20);
s2.insert(50);
s2.insert(40);
for (set<int, MyCompare>::iterator it = s2.begin(); it != s2.end(); it++) {
	cout << *it << " ";
}
cout << endl;

输出结果:50 40 30 20 10

示例二 set存放自定义数据类型

//自定义的数据类型
class Person 
{
public:
	Person(string name, int age) {
		this->m_Name = name;
		this->m_Age = age;
	}

	string m_Name;
	int m_Age;
};

//仿函数,指定排序规则为从大到小
class PersonCompare
{
public:
	bool operator()(const Person& p1, const Person& p2) const{
		//按照年龄降序
		return p1.m_Age > p2.m_Age;
	}
};

//自定义数据类型,都会指定排序规则
set<Person,PersonCompare>s3;

Person p1("Tom", 24);
Person p2("Jerry", 28);
Person p3("Peter", 25);
Person p4("Marry", 27);
s3.insert(p1);
s3.insert(p2);
s3.insert(p3);
s3.insert(p4);

for (set<Person>::iterator it = s3.begin(); it != s3.end(); it++) {
	cout << "name:" << (*it).m_Name << "    age:" << (*it).m_Age << endl;
}

输出结果:

name:Jerry age:28
name:Marry age:27
name:Peter age:25
name:Tom age:24

小结

  • 利用仿函数可以指定set容器的排序规则
  • 对于自定义数据类型,set必须要指定排序规则

pair对组创建

函数原型

  • pair<type,type> p (value1,value2);
  • pair<type,type> p = make_pair(value1,value2);

示例

	//第一种创建方式
	pair<string, int>p("Tom", 20);
	cout << "name: " << p.first << "  age: " << p.second << endl;

	//第二种创建方式
	pair<string,int>p2 = make_pair("Jerry", 15);
	cout << "name: " << p2.first << "  age: " << p2.second << endl;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值