c++ STL之map容器

简介

序列容器不提供方便的数据访问机制,相比而言,map容器提供了一种更高效的存储和访问数据的方法。
map容器是关联容器的一种。在关联容器中,元素的位置取决于和它关联的键的值。
map容器的元素是pair<const K,T >类型的对象,这种对象封装了一个T类型对象和一个与其关联的K类型的键。

map<K,T>容器

头文件#include <map>
特点:每个键都是唯一的,可以保存重复的对象,只要他们的键不同。容器中的元素都是有序的。
元素组织形式:红黑树(一种适度平衡的二叉搜索树,最长路径与最短路径不能相差2倍以上)

multimap<K,T>容器

头文件#include <multimap>
特点:允许使用重复的键,除此以外和狭义的map容器没什么不同
元素组织形式:红黑树

unordered_map<K,T>容器

头文件#include <unordered_map>
特点:元素的顺序不是直接由键值决定的,而是由键值的哈希值决定的。哈希值是由键值通过哈希函数生成的整数。该容器不允许重复的键。
元素组织形式:散列表

unordered_multimap<K,T>容器

头文件#include <unordered_multimap>
特点:该容器允许重复的键。除此以外和unorder_map容器没什么不同。
元素组织形式:散列表

基本操作

1.创建map容器

std::map<std::string , size_t> people;
//或者通过初始化列表 
std::map<std::string , size_t> people{ { "anna", 26} ,{"Bill" , 43} };
// utility头文件定义了 make_pair<T1,T2>() 函数模版
std::map<std::string, size_t> people { std::make_pair(" Jack" ,33), std::make_pair("bill" ,32)};
//通过复制构造函数
std::map<std::string , size_t> personnel{people};
std::map<std::string , size_t> personnel(people);
//通过另一个容器的一段元素来创建
std::map<std::string , size_t> personnel {people.begin(), people.end()}

2.插入元素

auto pr = people.insert({"sdgg", 34});  // 返回的pr是这样一个对象,它的成员变量 first 是新插入元素的迭代器, 成员变量second 是一个布尔值,如果插入成功则返回true

people["banny"] = 32; // 如果没有banny这个键,则添加这个键

3.就地构造元素

在map 的适当位置直接构造新元素,避免复制和移动操作

std::map<std::string , size_t> people;
auto pr = people.emplace( {"jack",33});  // 此处的pr 和insert() 返回的对象是一样的

4.访问元素

auto Jack = people.at("jack");    // 返回的是“Jack”词条下对应的数值 ,如果jack 不存在则返回异常
auto jack = people["jack"] ;  // 如果jack不存在则返回0 ,同时插入了一个键值对,{“jack” , 0}

5.检索元素

auto iter = people.find("jack") ;  // 返回的是jack位置的迭代器,如果没有jack 则返回 people.end()
cout << iter->first << " " <<iter->second <<endl;

输出: jack   33

auto a = people.count("jack");  // 对其中的jack 计数,返回数量,

6.删除元素

people.erase("jack"); //移除键和参数匹配的元素,然后返回移除元素的个数

people.erase(++people.begin(), --people.end()) ;   // 移除两个迭代器参数所定义范围的元素,此句删除除首尾以外的所有参数, 返回被移除的最后一个元素的下一个位置

people.clear() ;   // 删除所有元素
上一篇:Linux系统加固设置


下一篇:关于启用 HTTPS 的一些经验分享(一)