在学习关联容器(map、unordered_map……)之前,我们需要先了解名为pair的标准库类型。一个pair保存两个数据成员,第一个成员是first,第二个成员是second。
pair有什么用途呢?比如学生有学号和姓名,这两个属性是对应的,这时候用数组来保存学号和姓名就体现不出它们的对应关系了,我们可以用pair来保存。一个pair保存一个学生的学号和姓名,很多个学生的学号和姓名就用很多个pair来保存。
map是关联容器的一种,map是由一个个pair组成 。假设有一个寝室501,如图,寝室有4个学生,我们要用一种容器来保存这4个学生的学号和姓名,我们可以用一个pair保存一个学生的学号和姓名,一个map来保存一个寝室的4个学生,map的成员就是4个pair。
![](https://i-blog.csdnimg.cn/blog_migrate/811c5fed170ade8676351ffa3a61868c.png)
用法
pair<T1,T2> p; | 创建一个pair,包含两个已经被默认初始化的,类型分别为T1、T2的成员 |
---|---|
pair<T1,T2> p(v1,v2); | 创建一个pair,first成员的类型为T1,值为v1,second成员的类型为T2,值为v2 |
pair<T1,T2> p={v1,v2}; | 创建一个pair,first成员的类型为T1,值为v1,second成员的类型为T2,值为v2 |
make_pair(v1,v2); | 返回一个用v1和v2初始化的pair,pair的类型从v1和v2的类型推断出来 |
p.first; | 返回p的first数据成员 |
p.second; | 返回p的second数据成员 |
程序示例:
pair<string, string> p1("sc0301","小杨"); // 方式一,创建一个pair名为p1
pair<string, string> p2 = make_pair("sc0302", "小马"); // 方式二,make_pair函数返回一个用"sc0302"和 "小马"初始化的pair
pair<string, string> p3("sc0303", "小王");
pair<string, string> p4("sc0304", "小何");
string p1_ID = p1.first; // 得到pair的第1个成员
string p1_name = p1.second; // 得到pair的第2个成员
pair和map一起使用
仍然是前面一个寝室4个学生的例子。
程序示例:
#include <iostream>
#include <string>
#include <utility>
#include <map>
using namespace std;
int main() {
pair<string, string> p1("sc0301","小杨"); // 方式一,创建一个pair名为p1
pair<string, string> p2 = make_pair("sc0302", "小马"); // 方式二,make_pair函数返回一个用"sc0302"和 "小马"初始化的pair
pair<string, string> p3("sc0303", "小王");
pair<string, string> p4("sc0304", "小何");
map<string, string> m1; // 创建一个空map
map<string, string> m2{ p1,p2,p3,p4 }; // 创建一个包含pair p1、p2、p3、p4的map
map<string, string> m3{ {"sc0301","小杨"},{"sc0302", "小马"},{"sc0303", "小王"},{"sc0304", "小何"} }; // 效果同上一句
map<string, string>::iterator it1 = m2.begin(); // 得到指向m2首元素的迭代器
map<string, string>::iterator it2 = m2.end(); // 得到指向m2尾元素的下一个位置的迭代器
pair<string, string> p11 = *it1; // 得到m2的首元素{"sc0301","小杨"},这是一个pair
string p1_ID = it1->first; // 得到m2的首元素{"sc0301","小杨"}的fisrt成员,学号
string p1_name = it1->second; // 得到m2的首元素{"sc0301","小杨"}的second成员,姓名
for (auto p : m2) {
cout << "学号:" << p.first << "; 姓名:" << p.second << endl;
}
m1.insert(p1); // 在map中插入已有的pair
m1.insert({ "sc0302", "小马" }); // 插入键值对{ "sc0302", "小马" }
m1.insert(pair<string, string> ("sc0303", "小王")); // 创建一个无名pair对象,并插入到map中
m1.emplace(p1); // 要插入的关键字已在容器中,emplace/insert什么都不做
m1.emplace(pair<string, string>("sc0303", "小王")); // 要插入的关键字已在容器中,emplace/insert什么都不做
map<string, string>::iterator it = m2.find("sc0301"); // 查找关键字为"sc0301"的元素,返回一个迭代器
if (it == m2.end()) { // 若"sc0301"不在容器中,则it等于尾后迭代器
cout << "未找到!" << endl;
}
else {
pair<string, string> result1 = *it; // 找到了
}
int result2 = m2.count("sc0305"); // 查找关键字为"sc0301"的元素,返回关键字等于"sc0301"的元素数量
if (result2==0) {
cout << "未找到!" << endl;
}
else {
cout << "找到了!" << endl;
}
}
map的用法可参考:【C++】STL关联容器之map用法总结