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)),它将导致未定义的行为。