C++ Primer 笔记+习题解答(十一)

今天是第十一篇笔记,主要内容是关联容器。关联容器的涉及到的内容相比顺序容器是很少的,所以篇幅也是比较短小的。但是一些细节方面的问题还是比较晦涩的,经过一番挣扎后,我还是决定先放弃比较困难的部分。好读书不求甚解从某些层面来说也许是好事,有些东西真的需要一定基础才能理解透彻。在本节中,书上对无序容器的介绍很少,尤其是哈希相关的内容,基本就是一笔带过。

有错误 请指正 谢谢

1.引言:关联容器和顺序容器有着根本差异:

关联容器中的元素按照关键字来保存和访问,顺序容器中的元素是按照它们在容器中的位置来顺序保存和访问的。关联容器支持高效的关键字查找和访问。

关联容器分为两类:

map 和 set。map也叫关联数组和映射类型,set称为集合类型。可以参考其中的数学意思。

map是关键字-值,成对存在,但是set中关键字就是值,是以单个元素的形式存在。

新版标准库提供了8个关联容器:

主要的异同有三点:

1.是map或是set. 2.是否允许重复关键字(multi 前缀)。3.是否有序(unordered前缀)。

在无需容器中,元素是依靠哈希函数进行组织的。

头文件主要区分在无序和有序,同关键字是否重复无影响。有序容器的头文件是map&set.无序是对应的unordered_map&unordered_set.

2.使用关联容器:1.map:关键字-值,存在一种映射关系。 set :关键字即是值,也叫集合类型。2.凡是顺序容器中位置相关的操作,在关联容器中都是不支持的,意义不大。因为关联容器中同位置无关。3.关联容器中的迭代器都是双向的。4.定义关联容器:

map:要同时指明关键字类型和值类型,即同时在尖括号中提供两种类型信息。

set:只需要指明关键字类型。

都存在默认构造函数,即允许创建空容器。

初始化有两种:拷贝或者范围初始化.范围一般是指花括号列表或者迭代器范围。拷贝是指想匹配的容器之间的互相拷贝初始化。

multimap/multiset:主要区别在于此两种是允许关键字重复的。带multi前缀的是允许重复关键字的。

2.1关键字类型的要求:

有序关联容器中对其关键字类型有要求:必须是定义了元素的比较方法,不然如何区分有序。默认是使用<进行比较,但是可以自定义操作进行替代。

使用自定义关键字类型的比较函数用来组织容器中的元素,这个时候比较操作也成为类型的一部分,这个时候需要在方括号中提供自定义操作。

<span style="font-size:18px;"><span style="font-size:18px;">mutimap<Sales_data,decltype(Compare)*> book(Compare);</span></span><span style="font-size:18px;"><span style="font-size:18px;">这个地方使用的是函数指针类型,是可调用类型之一。在实例化的时候需要加上相应的函数名,此时的函数名自动转换为指针类型。</span></span>2.2 pair类型:

pair的英文解释是一对。是一种标准库类型,定义在头文件utility中,,pair中的数据成员都是public的。

示例:

<span style="font-size:18px;"><span style="font-size:18px;">pair<string,string> spair{"Max","Cy"};</span></span>其中两个成员分别被命名为first和second成员。我们可以通过.运算符进行访问:<span style="font-size:18px;"><span style="font-size:18px;">cout<<spair.first<<endl;</span></span>make_pair()函数:用给定的数据构建一个pair,其中类型可以由值类型提供。<span style="font-size:18px;"><span style="font-size:18px;">auto pa=make_pair("Max","Cy");//可以推断出类型。</span></span>3.关联容器的操作:<span style="font-size:18px;"><span style="font-size:18px;">key_type; //关键字类型。value_type; //值类型。mapped_type;//map特有类型。同key_type构成了一对。</span></span>3.1关联容器的迭代器:

解引用其迭代器会得到一个值类型,即上面提到的value_type.

key_type类型是const的,所以set的迭代器是const的。所以对其进行写的操作是无意义的。

遍历关联容器:支持begin和end成员,输出是按字典序排列的,因为一开始的时候就用了<进行比较。

3.2添加元素:

关联容器的insert成员可以添加一个元素或者一个范围。当添加重复关键字的时候,对不允许关键字重复的容器来说,是无影响的。

当接受一个范围(迭代器范围或者初始值列表)时,不允许关键字重复时,只会插入第一个带此关键字的元素。

当map中使用insert插入元素时,会返回一个pair类型,可以用来检测是否插入成功。first成员是一个迭代器,指向插入的元素。second成员是bool用来表示是否插入成功。

3.3删除成员:<span style="font-size:18px;"><span style="font-size:18px;">c.erase(k);删除关键字为k的元素,返回删除元素的个数。c.erase(p);删除迭代器p指向的元素,返回指向下一个元素的迭代器。c.erase(b,e); 删除迭代器b,e之间的元素,返回迭代器e.注意区间是左闭合。</span></span>3.4 map的下标操作:

只有map和unordered_map提供了下标操作。至于允许关键字重复的容器,使用关键字下标会有冲突。

map的下标操作有两种:类似数组的和at函数。

map的下标接受一个关键字,返回一个值类型,若此关键字不存在则会插入此不存在的关键字,并且对值执行值认初始化。

因为下标可能插入元素,故只能对非const的map执行此操作。

但是使用at函数的时候不会出现此状况,当关键字不存在的时候会抛出一个异常。

3.5访问元素:真正的停下来,享受自我的体验时刻,也许浮光掠影,

C++ Primer 笔记+习题解答(十一)

相关文章:

你感兴趣的文章:

标签云: