std::
map::operator[]
公众成员函数 <map>
C++98
C++11
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与容器中任何元素的键不匹配,则函数将插入一个具有该键的新元素,并返回对其映射值的引用。
注意,这样总是会使容器的大小增加1,即使没有给元素赋映射值(元素是使用默认构造函数构造的)。
类似的成员函数
map::at ,当具有键的元素存在时具有相同的行为,但当键不存在时抛出异常。
对这个函数的调用相当于:
(*((this->insert(make_pair(k,mapped_type()))).first)).second
☲ 参数
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不会产生这种效果。
输出:
mymap['a'] is an element
mymap['b'] is another element
mymap['c'] is another element
mymap['d'] is
mymap now contains 4 elements.
✥ 复杂度
容器大小:对数。
☣ 迭代器的有效性
不变
⇄ 数据竞争
容器被访问,并可能被修改。
该函数访问一个元素并返回一个引用,该引用可用于修改其映射值。并发访问其他元素是安全的。
如果函数插入一个新元素,则在容器中并发地迭代范围是不安全的。
☂ 异常安全性
强保证:如果抛出异常,容器中没有变化。
如果插入一个新元素,而
allocator_traits::construct 不能构造具有k和默认构造的
mapped_type 的元素
(或者如果
mapped_type 不是默认可构造的),则会导致未定义的行为。
🍄 另请参阅
map::find
获取元素迭代器(公众成员函数)
map::insert
插入元素(公众成员函数)
map::operator=
复制容器的内容(公众成员函数)