【C++】STL 容器 - map 关联容器 ③ ( map 容器常用 api 操作 | map 容器迭代器遍历 | map#insert 函数返回值处理 )
一、map 容器迭代器遍历
1、map 容器迭代器
C++ 语言中 标准模板库 ( STL ) 的 std::map 容器 提供了 begin() 成员函数 和 end() 成员函数 , 这两个函数 都返回一个迭代器 , 指向容器中的元素 ;
- std::map#begin() 成员函数 : 该函数返回指向容器中第一个元素的迭代器 ; 对于std::map 容器来说 , 该元素是按键排序后的第一个键值对 ; 如果 map 容器为空 , 则返回的迭代器就是 末尾迭代器 ;
- std::map#end() 成员函数 : 该函数返回指向容器末尾位置的迭代器 , 末尾位置实际上并不包含任何元素 , 而是作为遍历结束的标志 ; 如果通过 end() 末尾迭代器来访问元素直接崩溃退出 ;
迭代器指向的 map 容器元素说明 : std::map 容器是一个关联容器 , 它存储的元素按键值自动排序 ; 每个元素是一个键值对 对组对象 , 即 std::pair<const Key, T> 类型对象 , 其中 Key 是键类型,T 是值类型 ;
2、代码示例
代码示例 :
#include "iostream"
using namespace std;
#include "map"
#include "string"
int main() {
// 创建一个空的 map 容器,键为 string 类型,值为 int 类型
map<string, int> myMap;
// 插入元素
myMap.insert(pair<string, int>("Tom", 18));
//容器的遍历
cout << "遍历容器 :" << endl;
for (map<string, int>::iterator it = myMap.begin(); it != myMap.end(); it++)
{
cout << it->first << "\t" << it->second << endl;
}
cout << "遍历结束" << endl;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 :
遍历容器 :
Tom 18
遍历结束
请按任意键继续. . .
二、map 容器插入结果处理
1、map#insert 函数返回值处理
map#insert 函数原型如下 , 其 返回值是 pair<iterator, bool> 类型 的 , 通过判定 pair 对组的第二个值来确定插入是否成功 ;
map#insert 函数原型 :
pair<iterator, bool> insert(const value_type& value);
- 参数解析 :
- 参数类型 : value_type 是 map 容器中存储的元素的类型 , 具体类型为 pair<const Key, T> 类型 , Key 是键的类型 , T 是值的类型 ;
- 参数对象 : 传入的 value 对象 就是一个 pair 对组对象 , 是一个 键值对 元素 ;
- 返回值解析 : 返回值类型为 pair<iterator, bool> , 也是一个 pair 对组对象 ;
- 返回值对组的 第一个值是 iterator 迭代器 , 指向已经插入的 键值对 元素 ;
- 返回值对组的 第二个值是 布尔值 , 表示插入是否成功 ,
- 如果键 Key 已经存在 , 则插入失败 , 返回 false ;
- 如果键 Key 不存在 , 则插入新元素 , 返回 true ;
下面的代码中 , map 容器的类型是 map<string, int> , 其迭代器类型是 map<string, int>::iterator , map#insert 函数的返回值是 迭代器类型 和 bool 值组成的键值对 , 该 map 容器对应的 insert 函数返回值是 pair<map<string, int>::iterator, bool> 类型 ;
// 创建一个空的 map 容器,键为 string 类型,值为 int 类型
map<string, int> myMap;
// 插入键值对 ("Tom", 18)
myMap.insert(pair<string, int>("Tom", 18));
使用返回值接收上述 insert 函数插入 键值对元素 , 接收变量为 pair<map<string, int>::iterator, bool> insertRet ;
// 创建一个空的 map 容器,键为 string 类型,值为 int 类型
map<string, int> myMap;
// 插入键值对 ("Tom", 18)
// 返回值类型为 pair<map<string, int>::iterator, bool>
pair<map<string, int>::iterator, bool> insertRet = myMap.insert(pair<string, int>("Tom", 18));
上述返回的值类型为 pair<map<string, int>::iterator, bool> ,
使用 insertRet.first 可以访问 上述 键值对的 map<string, int>::iterator 迭代器值 ,
使用 *(insertRet.first) 可以访问到 map<string, int> 的键值对单个元素 pair<string, int> 对象 ,
使用 insertRet.first->first 可以访问 键值对元素的 键 Key ,
使用 insertRet.first->second 可以访问 键值对元素的 值 Value ;
2、代码示例
代码示例 :
#include "iostream"
using namespace std;
#include "map"
#include "string"
int main() {
// 创建一个空的 map 容器,键为 string 类型,值为 int 类型
map<string, int> myMap;
// 插入键值对 ("Tom", 18)
// 返回值类型为 pair<map<string, int>::iterator, bool>
pair<map<string, int>::iterator, bool> insertRet = myMap.insert(pair<string, int>("Tom", 18));
// 判定插入是否成功
if (insertRet.second != true) {
cout << "(Tom, 18)插入失败" << endl;
} else {
cout << "(Tom, 18)插入成功 : " << insertRet.first->first << "\t" << insertRet.first->second << endl;
}
// 插入键值对 ("Tom", 12)
insertRet = myMap.insert(make_pair("Tom", 12));
// 判定插入是否成功
if (insertRet.second != true) {
cout << "(Tom, 12)插入失败" << endl;
}
else {
cout << "(Tom, 12)插入成功 : " << insertRet.first->first << "\t" << insertRet.first->second << endl;
}
//容器的遍历
cout << "遍历容器 :" << endl;
for (map<string, int>::iterator it = myMap.begin(); it != myMap.end(); it++)
{
cout << it->first << "\t" << it->second << endl;
}
cout << "遍历结束" << endl;
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
};
执行结果 :
(Tom, 18)插入成功 : Tom 18
(Tom, 12)插入失败
遍历容器 :
Tom 18
遍历结束
请按任意键继续. . .