【c++ primer 笔记】第九章 顺序容器

来源:互联网 发布:云计算优缺点 编辑:程序博客网 时间:2024/04/30 23:32

1.

vector, deque, list, forward_list, array, string的区别

vector              可变大小数组,支持快速随机访问,在尾部之外的位置插入或删除元素可能很慢

deque              双端队列,支持快速随机访问,在中间位置添加或删除元素的代价可能很高,但是在两端添加或删除元素很快

list                    双向链表,只支持双向顺序访问,在任何位置插入或删除元素都很快

forward_list      单向链表,只支持单向顺序访问

array                固定大小数组,支持快速随机访问,不能添加或删除元素

list和forward_list的额外内存开销大

forward_list没有size操作


2.

容器间可以进行拷贝,但他们必须是相同的容器类型,且保存的是相同的元素类型

当传递迭代器参数来拷贝一个范围时,就不要求容器类型是相同的了。而且,新容器和原容器中的元素类型也可以不同,只要能将要拷贝的元素转换为要初始化的容器的元素类型即可

vector<const char*> articles = {"a", "an", "the"};forward_list<string> words(articles.begin(),articles.end());

在新标准中,我们可以对一个容器进行列表初始化。

如果元素类型是内置类型或是具有默认构造函数的类类型,可以只为构造函数提供一个容器大小的参数。如果元素类型没有默认构造函数,除了大小参数,还必须制定一个显示的元素初始值

当定义一个array时,除了指定元素类型,还要指定容器大小,大小是array类型的一部分

array<int, 42>  arr;

不同于内置数组,array可以进行拷贝和赋值操作

赋值相关操作会导致指向左边容器内部的迭代器、引用和指针失效。而swap操作将容器内容交换不会导致指向容器的迭代器、引用和指针失效(array和strign除外)

除array外,swap不对任何元素进行拷贝、删除或插入操作,因此可以保证在常数时间内完成,而swap两个array会真正交换他们的元素


3.

vector和string不支持push_front和emplace_front

forward_list不支持push_back和emplace_back

insert将元素插入到迭代器所指定的位置之前,接受一对迭代器或一个初始化列表的insert版本将给定范围中的元素插入到指定位置之前

接受元素个数或范围的insert版本返回指向第一个新加入元素的迭代器


当我们调用emplace成员函数时,则是将参数传递给元素类型的构造函数,emplace成员使用这些参数在容器管理的内存空间中直接构造元素

c.emplace_back("987-0590353403", 25, 15.99);c.push_back(Sales_data("987-0590353403", 25, 15.99);

访问元素时,如果我们希望确保下标是合法的,可以使用at成员函数。at成员函数类似下标运算符,但如果下标越界,at会抛出一个out_of_range异常

删除元素

c.erase(p);

删除迭代器p所制定的蒜素,返回一个指向被删元素之后元素的迭代器

c.erase(b,e);

删除迭代器b和e所制定范围内的元素,返回一个指向最后一个被删除元素之后元素的迭代器

删除deque中除首尾位置之外的任何元素都会使所有迭代器、引用和指针失效。指向vector或string中删除点之后位置的迭代器、引用和指针都会失效


4.

reserve并不改变容器中元素的数量,它仅影响vector预先分配多大的内存空间。当需求大小小于当前容量时,容器不会退回内存空间。因此,在调用reserve之后,capacity将会大于或等于传递给reserve的参数

容器的size是指它已经保存的元素的数目,而capacity则是在不分配新的内存空间的前提下它最多可以保存所少元素


5.

string s(cp,n);

s是cp指向的数组中前n个字符的拷贝

string s(s2,pos2);

s是string s2从下标pos2开始的字符的拷贝

find 返回第一个匹配位置的下标,可选参数可指出从哪个位置开始搜索

s.find_first_of(args) 在s中查找args中任何一个字符第一次出现的位置

s.find_first_not_of(args) 在s中查找第一个不在args中的字符的位置


6.

顺序容器适配器:stack, queue, priority_queue

默认情况下,stack和queue是基于deque实现的,priority_queue是在vector之上实现的
每个容器适配器都基于底层容器类型的操作定义了自己的特殊操作。我们只可以使用适配器操作,而不能使用底层容器类型的操作

0 0