新概念:关联容器 “键-值”对
关联容器,其名字一分为二(关联-容器)。那么首先它是一种容器,容器这个概念已经在前面的章节介绍过了,那么关联是什么意思呢?它作为容器,它就得存储一系列数据,但是它却和我们之前看到的所有容器都不同,它存储的数据和某种“键”具有关联性。这和我们前面的“索引”和值之间的关联有些类似,不同之处是,“索引”和值仅仅是暂时的关联,当容器发生变化的时候,这种关联就可能会失去。但是关联容器中的“键-值”关联是真正的关联,它不会因为容器的变化而变化。
“键-值”对就是构成关联容器的基本元素。其实就是两种数据,我们认为的将其中一种数据赋予键的特性,让其成为索引另一个数据的依据;而将另一种数据作为值,可以由“键”索引到。“键”可以是任何可以比较的类型,比如我们可以将字符串作为键去查找整型值,这就类似我们的通过名字查找电话号码。
新设施:std::map、std::pair
本章主要介绍了标准库关联容器中的一种std::map。而这个关联容器中的元素(也就是“键-值”对)是标准库类型std::pair,这是个简单的类型,仅仅是将两种类型放到一起形成对而已。std::map和其他容器一样具有插入、删除、索引、遍历等操作,但它的内部存储结构是对我们隐藏了的。它通过一些便于索引的数据结构(平衡树)来存放数据,尽可能的让我们使用起来更为方便高效(虽然性能上可能比不上通过散列存储的无序容器,但供普通用户使用足矣)。std::map也提供我们之前看到的容器访问方式“[]”,通过方括号来访问某个元素,不同的是参数是键类型。
注意:关联容器中的operator[]
前面说到了std::map可以通过操作符[]进行元素访问,但是这个操作符在关联容器中有个副作用值得大家注意。当参数键值在关联容器中不索引任何值(即不存在这个键-值对),那么关联容器将会创建一个,并会使用默认初始化去初始化值。例如我们有一个std::map<std::string, int> counters;这样的关联容器,
其中不存在(”name”-100)这样一个键-值对,如果我们写了counters[name];这样一行看似没有任何作用的代码,但是在我们关联容器中却会带来变化,counters会增加一个键-值对(”name”-0),因为内置类型的默认初始化为0(等同于int())。
这样的效果不容易被发现,所以大家在使用的时候千万要注意。
特别说明:我将本章概念提前知内容放得很少,因为我将在课堂上将上面几章的所有示例代码进行讲解,到时候我会给大家代码的副本。
下一课:C++课堂第8章 编写泛型函数 希望我的课堂对大家学习C++有所帮助