通常,关联式容器并不提供元素的直接访问,你必须依靠迭代器。不过 map(以及7.9节第355页介绍的无序容器)是例外。Non-const map提供了subscript(下标)操作符,支持元素的直接访问,如表7.46所列。C++11另外提供一个成员函数at(),可用于const和non-const map
Operation | effect | 影响 |
c[key] | nserts an element with key, if it does not yet exist, and returns a reference to the value of the element with key (only for nonconstant maps) | 安插一个带着key的元素——如果尚未存在于容器内。返回一个reference指向带着key的元素(only for nonconstant maps) |
c.at(key) | Returns a reference to the value of the element with key (since C++11) | 返回一个reference指向带着key的元素(始自C++11) |
at()会依据它收到的“元素的 key”取得元素的 value;如果不存在这样的元素则抛出out_of_range异常。
至于operator [],其索引就是key。这意味着operator []的索引可能属于任何类型,不一定是整数。如此的接口就是所谓的关联式数组(associative array)接口。
“operator[] 的索引类型不必然是整数”并不是它和寻常array唯一不同之处。如果你选择某key 作为索引,容器内却没有相应元素,那么map会自动安插一个新元素,其 value将被其类型的 default构造函数初始化。因此,你不可以指定一个“不具 default构造函数”的 value类型。注意,基础类型都有一个 default构造函数,设立.初值0(见3.2.1节第37页)。
关联式数组的行为方式可说是毁誉参半:
优点是你可以通过更方便的接口对map安插新元素。例如:
std::map<std::string,float> coll; // empty collection // insert "otto"/7.7 as key/value pair // - first it inserts "otto"/float() // - then it assigns 7.7 coll["otto"] = 7.7; 其中的语句coll["otto"] = 7.7处理如下: 1.处理coll["otto"]: 1.1 如果存在key为"otto"的元素,上式会返回元素的reference; 1.2 如果没有任何元素的key 是"otto",上式便为map自动安插一个新元素,令其 key为"otto",其value则以default构造函数完成,并返回一个reference指向新元素。 2.将7.7赋值给value: 接下来便是将7.7赋值给上述刚刚诞生的新元素。
这样,map 之内就包含了一个key为"otto"的元素,其value为7.7 。