STL关联容器之map使用详解

本文详细介绍了STL中map容器的插入方法(insert、emplace和emplace_hint),分析了在key存在和不存在时的构造、析构开销,并强调了删除和查找操作的注意事项,提倡在插入时优先使用emplace以减少构造和析构次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值