您的位置:首页 > 编程语言 > C语言/C++

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

LYAJJ 2020-06-29 05:04 197 查看 https://blog.csdn.net/lyajj/ar

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

标签: