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 << " ";
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);
pr = s2.insert(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;
s1.insert(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);
itr1 = s.begin();
itr2 = s.begin();
for (int i = 0; i < 3; i++)
++itr2;
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允许重复元素,两个都是映射,键映射到值
初始化:
加入元素:
函数 | 功能 |
---|
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]));
itr = m.begin();
itr1 = m.end();
--itr1;
m1.insert(itr, itr1);
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;
}
删除元素:
函数 | 功能 |
---|
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.erase(1);
cout << "m中键1的数量:" << m.count(1) << endl;
cout << "m中键3情况:";
if (m.find(3) != m.end())
cout << m.find(3)->first << " " << m.find(3)->second << endl;
else cout << "不存在键3"<<endl;
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);
cout << "m中键的数量:" << m.size() << endl;
cout << "m是否为空:" << m.empty() << endl;
}
参考:https://blog.csdn.net/forever__1234/article/details/89647975