【C++标准库】7-STL容器-Map与Multimap-关联数组-异常处理-运用实例

1.将Map视为关联式数组(Associative Array)

通常,关联式容器并不提供元素的直接访问,你必须依靠迭代器。不过 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 。

上一篇:c++ 读取数量不定的数据


下一篇:Raw-OS互斥的源代码分析的量的Mutex