C++ Reference: Standard C++ Library reference: Containers: map: map: operator[]

本文详细介绍了C++标准库中map容器的operator[]成员函数,该函数用于访问或插入元素。当键已存在时,返回映射值的引用;若键不存在,则插入新元素并返回其引用。此操作会增加容器大小,即使未显式初始化新元素。与map::at不同,operator[]在键不存在时不会抛出异常,而是默认构造新元素。文中还提供了一个示例程序来演示其用法,并讨论了操作的复杂度和安全性。

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

C++官网参考链接:https://cplusplus.com/reference/map/map/operator[]/

公有成员函数 
<map>
std::map::operator[]
C++98
mapped_type& operator[] (const key_type& k);
C++11
mapped_type& operator[] (const key_type& k);
mapped_type& operator[] (key_type&& k);
访问元素
如果k匹配容器中某个元素的键,则函数返回对其映射值的引用。
如果k与容器中任何元素的键不匹配,则函数插入一个带有该键的新元素,并返回对其映射值的引用。注意,这总是使容器的大小(container size)增加1,即使没有将映射值赋给元素(元素是使用其默认构造函数构造的)。
类似的成员函数map::at在具有键的元素存在时具有相同的行为,但在不存在时抛出异常。
对这个函数的调用相当于: 
(*((this->insert(make_pair(k,mapped_type()))).first))。

形参 
k
访问其映射值的元素的键值。
成员类型key_type是容器中存储的元素的键的类型,在map中定义为其第一个模板形参(Key)的别名。
如果是右值(第二个版本),则在插入新元素时将移动键而不是复制键。

返回值
对元素的映射值的引用,其键值等价于k。
成员类型mapped_type是容器中映射值的类型,在map中定义为其第二个模板形参(T)的别名。

用例
// accessing mapped values
#include <iostream>
#include <map>
#include <string>

int main ()
{
  std::map<char,std::string> mymap;

  mymap['a']="an element";
  mymap['b']="another element";
  mymap['c']=mymap['b'];

  std::cout << "mymap['a'] is " << mymap['a'] << '\n';
  std::cout << "mymap['b'] is " << mymap['b'] << '\n';
  std::cout << "mymap['c'] is " << mymap['c'] << '\n';
  std::cout << "mymap['d'] is " << mymap['d'] << '\n';

  std::cout << "mymap now contains " << mymap.size() << " elements.\n";

  return 0;
}
注意最后一次访问(对元素'd')是如何使用该键在map中插入一个新元素并初始化为它的默认值(一个空字符串)的,即使访问它只是为了获取它的值。成员函数map::find不会产生这种效果。输出:

复杂度
size中的对数。

iterator的有效性
没有变化。

数据竞争
容器被访问,并可能被修改。
函数访问一个元素并返回一个引用,该引用可用于修改其映射值。同时访问其他元素是安全的。
如果函数插入新元素,则同时迭代容器中的范围是不安全的。

异常安全
强保证:如果抛出异常,则容器中不会有任何更改。
如果插入一个新元素,而allocator_traits::construct不能构造一个带有k和默认构造的mapped_type的元素(或者如果mapped_type不是默认可构造的(default constructible)),它将导致未定义的行为。  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40186813

你的能量无可限量。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值