引言
map是STL标准模板库中的常用容器之一,其底层实现为红黑树,特别适用于需要根据关键字快速查找目标值的场景。以下主要讲解map的一些常用方法和使用场景等。
插入元素
1. 数组下标方式插入
std::map<int, int> my_map;
my_map[0] = 11;
- 当key存在时,直接将值更新为目标值。
- 当key不存在时,会先构造一个map元素,值为默认值,然后再将值更新为目标值。
2. insert方法插入
std::map<int, int> my_map;
auto iter = my_map.insert({
0, 11});
my_map.insert({
{
1,11},{
0,11},{
10,10}}); // 初始化列表插入多个元素
- 当key不存在时,会构造一个临时的pair对象,然后移动到map中。
- 当key存在时,依旧会构造一个临时的pair对象,但不会插入,而是直接返回。
- 返回值是一个
std::pair<iterator, bool>
对象:- 若key存在,第一个元素则指向插入位置,第二个元素值为true
- 若key不存在,第一个元素则指向冲突的位置,第二个元素值为false
- 初始化列表的方式,一次插入多个键值对,返回值为void型
3. emplace/emplace_hint方法插入
std::map<int, int> my_map;
auto iter = my_map.emplace(0, 11);
auto iter2 = my_map.emplace_hint(iter.first, 1, 11); // 在key 0 所在的位置插入key 1
- 当key不存在时,直接构造一个元素,然后插入到map中。
- 当key存在时,同样也会先构造一个元素,然后再析构,不会更新value。
- 返回值同insert方法。
- emplace_hint多了一个参数,指定插入位置,但如果此位置不是其真正要插入的位置,则会移动其到正确的位置。
三者之间的比较
1. key不存在时
#include <iostream>
#include <map>
#include <string>
class A {
public:
A() {
std::cout << "construct " << this << std::endl; }
~A() {
std::cout << "destruct " << this << std::endl; }
A(const A& rhs) {
std::cout << "copy construct " << this << std::endl; }
A(A&& rhs) {
std::cout << "move construct " << this << std::endl; }
A& operator