C++关联容器标准库笔记

C++关联容器标准库笔记

关联容器:map,multimap,set,multiset

1.set和multiset:multiset允许重复元素存在,set不允许。

初始化:

函数功能
set<数据类型> 标识符
set<数据类型> 标识符(itr1,itr2)用迭代器itr1,itr2之间的元素初始化,默认按升序排序,且无重复元素。

如果想按升序排序:set<数据类型,greater<数据类型>>

位置相关:

函数功能
s.begin()返回容器指向首元素的迭代器
s.end()返回容器指向尾元素下一位置的迭代器
s.rbegin()返回容器的指向逆向首元素的迭代器
s.rend()返回容器指向逆向尾元素下一位置的迭代器
#include<iostream>
#include<set>
using namespace std;
int main()
{
	int a[5] = { 5,1,3,4,2 };
	set<int> s1;
	set<int> s2(a, a + 5);		//初始化
	set<int>::iterator itr;
	set<int>::reverse_iterator ritr;	//逆向迭代器
	for (itr = s2.begin(); itr != s2.end(); itr++)
		cout << *itr << " ";	//访问
	cout << endl;
	for (ritr = s2.rbegin(); ritr != s2.rend(); ritr++)
		cout << *ritr << " ";	//逆序访问,reverse_iterator的++操作是向后移动。
	cout << endl;
}

在这里插入图片描述

查找元素:

函数功能
s.lower_bound(a)返回第一个大于或等于a的元素的迭代器
s.upper_bound(a)返回第一个大于a的元素的迭代器
s.find(a)返回第一个等于a的元素的迭代器
s.count(a)查找s中某个键出现的次数,只能为1或0
s.equal_range(a)返回一对迭代器,分别是第一个大于或等于a,第二个大于a,如果失败会等于end()
#include<iostream>
#include<set>
using namespace std;
int main()
{
	int a[5] = { 5,1,3,4,2 };
	set<int> s1;
	set<int> s2(a, a + 5);		//初始化
	set<int>::iterator itr;
	set<int>::reverse_iterator ritr;
	for (itr = s2.begin(); itr != s2.end(); itr++)
		cout << *itr << " ";	//访问
	cout << endl;
	cout << "第一个大于或等于3的元素:";
	if (s2.lower_bound(3) != s2.end())
		cout << *s2.lower_bound(3) << endl;

	cout << "第一个大于3的元素:";
	if (s2.upper_bound(3) != s2.end())
		cout << *s2.upper_bound(3) << endl;

	cout << "第一个等于6的元素:";
	if (s2.find(6) != s2.end())
		cout << *s2.find(6) << endl;
	else cout << "没有" << endl;
	
	pair<set<int>::iterator, set<int>::iterator> pr;
	pr = s2.equal_range(4);
	cout << "第一个大于等于4的元素:" <<*pr.first << endl;
	cout << "第一个大于4的元素:" << *pr.second << endl;
}

在这里插入图片描述

加入元素:

函数功能
s.insert(a)将a插入到s中,返回pair类型,pair中第一个为指向该元素的迭代器,第二个为bool类型
s.insert(itr1,itr2)将itr1,itr2之间的元素插入到s,不包括后者
#include<iostream>
#include<set>
using namespace std;
int main()
{
	int a[5] = { 5,1,3,4,2 };
	set<int> s1;
	set<int> s2(a, a + 5);
	set<int>::iterator itr;
	pair<set<int>::iterator, bool> pr;
	s2.insert(6);		//s2插入6
	pr = s2.insert(3);	//s2插入3
	cout << "s2 是否能添加3:" << pr.second<<endl;
	cout << "s2 after insert:";
	for (itr = s2.begin(); itr != s2.end(); itr++)
		cout << *itr << " ";
	cout << endl;
	itr = s2.begin();
	set<int>::iterator itr2 = s2.end();
	--itr2;		//itr2此时指向s2中的6
	s1.insert(itr,itr2);	//s1插入迭代器itr到itr2之间的元素,不包括后者
	cout << "s1 after insert:";
	for (itr = s1.begin(); itr != s1.end(); itr++)
		cout << *itr << " ";
	cout << endl;

在这里插入图片描述

删除元素:

函数功能
s.erase(itr1,itr2)删除迭代器itr1与itr2之间的元素,不包括后者
s.erase(a)删除键值为a的值
s.erase(itr)删除迭代器所指的元素
s.clear()清空全部元素

元素个数:

函数功能
s.empty()判断容器是否为空
s.size()判断容器个数
#include<iostream>
#include<set>
using namespace std;
int main()
{
	int a[8] = { 2,5,4,3,1,7,8,9 };
	set<int> s(a,a+8);
	set<int>::iterator itr1, itr2;
	cout << "删除前:";
	for (itr1 = s.begin(); itr1 != s.end(); ++itr1)
		cout << *itr1 << " ";
	cout << endl;
	s.erase(9);		//删除元素9,如果没有不会报错
	itr1 = s.begin();
	itr2 = s.begin();
	for (int i = 0; i < 3; i++)
		++itr2;		//将itr2往前移动3个单位,现指向第四个元素
	s.erase(itr1, itr2);		//第四个元素不会被删除
	cout << "删除后:";
	for (itr1 = s.begin(); itr1 != s.end(); ++itr1)
		cout << *itr1 << " ";
	cout << endl;
	s.clear();
	cout << "s是否为空?" << s.empty() << endl;
}

在这里插入图片描述

2.map和multimap:multimap允许重复元素,两个都是映射,键映射到值

初始化:

函数功能
map<数据类型1,数据类型2> 标识符

加入元素:

函数功能
m.insert(pair<数据类型1,数据类型2>(类型1的数据a,类型2的数据b))加入键为a,值为b的映射返回迭代器以及bool型数(如果存在键a,不替换a的值b)
m.insert(itr,pair<类型1,类型2>(a,b))在迭代器itr所指位置插入元素。
m1.insert(itr1,itr2)将m中迭代器itr1到itr2之间的元素插入到m1中
m.insert({a,b})将键a和值b插入到m中
m.insert(itr,{a,b})将键a和值b插入到迭代器itr所指位置
m[a] = b如果存在键 a,会将原来的值覆盖变成b。如果没有则添加。

初始化和加入元素都会对键进行排序

访问元素:

函数功能
m[a]访问容器中键a对应的值,如果没有,容器会自动添加,值为默认值
m.at(a)访问容器中键a对应的值,不检查是否存在,没有就报错
#include<iostream>
#include<map>
using namespace std;
int main()
{
	map<int, string> m;		//常用初始化
	map<int, string>m1;
	map<int, string>::iterator itr,itr1;
	int a[5] = { 5,3,1,2,4 };
	string b[5] = { "s1","s2","s3","s4","s5" };
	itr = m.begin();
	
	m.insert(itr, { 7,"s7" });
	m.insert({ 6,"s6" });
	for (int i = 0; i < 5; i++)
		m.insert(pair<int, string>(a[i], b[i]));		//对m添加元素

	itr = m.begin();
	itr1 = m.end();
	--itr1;
	m1.insert(itr, itr1);		//对m1添加元素
	
	cout << "m的映射:" << endl;
	for (itr = m.begin(); itr != m.end(); itr++)
		cout << itr->first << " " << itr->second << endl;
	cout << "m1的映射:" << endl;
	for (itr1 = m1.begin(); itr1 != m1.end(); itr1++)
		cout << itr1->first << " " << itr1->second << endl;

	pair<map<int, string>::iterator, bool> pr;
	pr = m.insert(pair<int, string>(1, "ss1"));
	if (pr.second)
		cout << pr.first->first << " " << pr.first->second << endl;
	else
		cout << "已存在,添加失败" << endl;		//尝试添加

	cout << m[1] << endl;
	cout << m.at(2) << endl;
	cout << m[10] << endl;		//不存在键10,不会输出但已经添加键
}

在这里插入图片描述

删除元素:

函数功能
m.erase(a)删除元素,返回删除的数量,map里面只有0或1
m.erase(itr)删除迭代器所指向的位置的键值对,返回指向下一元素的迭代器
m.erase(itr1,itr2)删除迭代器所指向的范围内的键值对(不包括后者)
m.clear()清除全部元素

查找元素:

函数功能
m.count(a)查找键a在容器出现的次数
m.find(a)存在返回指向该元素的迭代器,不存在则返回m.end()
m.lower_bound(a)返回键大于等于a的第一个元素的迭代器
m.upper_bound(a)返回键大于a的第一个元素的迭代器
m.equal_range(a)返回一对迭代器,第一个为键等于a的元素所指的迭代器,第二个为键大于a的元素所指迭代器,都没有则返回m.end()。

元素个数:

函数功能
m.size()返回元素的个数
m.empty()判断容器是否为空
#include<iostream>
#include<map>
using namespace std;
int main()
{
	map<int, string> m;		//常用初始化
	map<int, string>m1;
	map<int, string>::iterator itr,itr1;
	int a[5] = { 5,3,1,2,4 };
	string b[5] = { "s1","s2","s3","s4","s5" };
	for (int i = 0; i < 5; i++)
		m.insert(pair<int, string>(a[i], b[i]));		//对m添加元素
		
	m.erase(1);
	cout << "m中键1的数量:" << m.count(1) << endl;		//判断键1的数量
	cout << "m中键3情况:";
	if (m.find(3) != m.end())
		cout << m.find(3)->first << " " << m.find(3)->second << endl;
	else cout << "不存在键3"<<endl;			//m中若有键3则返回对应的迭代器

	cout <<"m中大于等于键4的情况:"<<m.lower_bound(4)->first << " " << m.lower_bound(4)->second << endl;
	cout << "m中大于键4的情况:" << m.upper_bound(4)->first << " " << m.upper_bound(4)->second << endl;

	pair<map<int, string>::iterator, map<int, string>::iterator> pr;
	pr = m.equal_range(2);		//返回一对迭代器
	cout << "m中大于等于2的情况:" << pr.first->first << " " << pr.first->second << endl;
	cout << "m中大于2的情况:" << pr.second->first << " " << pr.second->second << endl;

	itr = m.begin();
	itr1 = m.end();
	m.erase(itr, itr1);		//删除m中所有元素
	cout << "m中键的数量:" << m.size() << endl;
	cout << "m是否为空:" << m.empty() << endl;

}

在这里插入图片描述
参考:https://blog.csdn.net/forever__1234/article/details/89647975

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值