C++primer_第九章_顺序容器_学习跟踪

1.        vector在尾部之外的其他位置插入或删除元素可能很慢;

2.        deque双端队列,支持快速随机访问,在头尾位置插入、删除速度很快;

3.        list双向链表,只支持双向顺序访问,在任何位置插入删除速度都很快;

4.        forward_list单向链表,只支持单向顺序访问,在链表任何位置插入或删除速度都很快;

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

6.        string与vector相似的容器,但专门用于保存字符;

7.        每个容器都定义在一个头文件中,文件名与类型名相同;

8.        容器均为模板类,必须提供额外的信息来生成特定的容器类型;

9.        顺序容器构造函数的一个版本接受容器大小参数,它使用元素类型的默认构造函数。但某些类没有默认构造函数。我们可以定义一个保存这种类型的对象的容器,但我们在构造这种容器时不能只传递给它一个元素数目参数;

10.    forward_list迭代器不支持递减操作;

11.    迭代器的范围为一个左闭合区间,即end指向的是尾后的位置;

12.    对一个反向迭代器执行++操作,会得到上一个元素;

13.    只有顺序容器(不包括array)的构造函数才能接受大小参数,且该构造函数时explicit的;

14.    当创建一个容器为另外一个容器的拷贝时,两个容器的类型及其元素类型必须严格匹配(通过直接初始化的方式)。但当使用传递迭代器参数来拷贝一个范围时,只要能将拷贝的元素转换为要初始化的容器的元素即可;

15.    如果元素类型是内置类型或者是具有默认构造函数的类类型,可以只为构造函数提供一个大小参数。如果元素类型没有默认构造函数,除了大小参数以外,还必须指定一个显式的元素初始值;

16.    与内置数组一样,标准库array的大小也是类型的一部分,当定义一个array时,除了指定元素类型,还要指定容器大小,例如:array<int,40>;

17.    array通常使用默认初始化或列表初始化(但不允许将花括号列表赋予array),和内置数组不同的是,array可以进行拷贝或对象赋值操作,只要数组类型匹配即可(包括元素类型与大小);

18.    顺序容器的赋值函数assign操作不适用于关联容器和array。seq.assign(b,e)表示将seq中的元素替换为迭代器b和e所表示范围中的元素。Seq.assign(il)表示将seq中的元素替换为初始化列表il中的元素。Seq.assign(n,t)表示将seq中的元素替换为n个值为t的元素;

19.    assign赋值相关运算会导致指向左边容器内部的迭代器,引用和指针失效。而swap操作将容器内容交换不会导致指向容器的迭代器、引用和指针失效(容器类型为array和string除外);

20.    assign允许我们从一个不同但相容的类型赋值;

21.    与其他容器不同,对一个string调用swap会导致迭代器、引用和指针失效。和其他容器不同,swap两个array会真正交换他们的元素,因此,对于array,在swap操作之后,指针、引用和迭代器所绑定的元素保持不变,但元素值已经于另一个array中对应的值进行了交换;

22.    只有当容器的元素类型也定义了相应的比较运算符时,我们才可以使用关系运算符来比较两个容器;

23.    接受一个单参数的const char*的string构造函数不是explicit的,因此当执行拷贝构造时,编译器默认存在单参数const char*向string的默认转换;

24.    接受一个容量参数的vector构造函数是explicit的;

25.    顺序容器的push_back(t)函数在容器的尾部创建一个值为t的元素,emplace(args)函数在容器尾部创建一个由args参数创建的元素,返回void。类似的函数有push_front、emplace_front。insert(p,)函数在迭代器p指向的元素之前插入一个或若干元素,均返回指向新添加的第一个元素的迭代器,若插入0个元素,则返回p;

26.    forward_list不支持push_back和emplace_back函数。vector和string不支持push_front和emplace_front函数;

27.    向一个vector、string或deque插入元素会使所有指向容器的迭代器、引用和指针失效;

28.    虽然某些容器不支持push_front操作,但他们对于insert操作并无类似的限制。因此我们可以将元素插入到容器的开始位置;

29.    顺序容器的at和下标操作只支持能够支持随机访问的那几个容器,back()返回尾元素的引用,front()返回首元素的引用,但当容器为空时,函数的行为时未定义的;

30.    Forwar_list不支持back()函数;

31.    如果我们使用auto变量来保存back()等函数的返回值,虽然这些返回值返回的是一个引用,当我们希望使用此变量来改变元素的值,必须记得将变量定义为引用类型;

32.    容器的下标运算符并不检查下标是否在合法的范围内。如果我们希望确保下标是合法的,可以使用at成员函数;

33.    迭代器范围(b,e)中的e表示的是尾后迭代器,其所指向的元素不再迭代器的范围之内;

34.    容器的erase(b,e)删除迭代器b和e指定范围内的元素。返回一个指向最后一个被删除元素之后的迭代器,若b不等于e,则返回的就是迭代器e;

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

36.    容器的pop_back和pop_front返回void;

37.    由于forward_list为单链表,其定义了insert_after,emplace_after和erase_after函数,均对迭代器指向的元素之后的下一个元素进行操作。比如insert_after和emplace_after在迭代器p之后的位置插入元素,并返回指向最后一个插入元素的迭代器。Erase_after删除迭代器p指向的位置之后的元素,并返回被删除元素之后元素的迭代器;

38.    可以用resize来增大或缩小容器,如果当前大小大于所要切的大小,容器后部的元素会被删除,如果当前大小小于新大小,会将元素添加到容器后部。如果resize缩小容器,则指向被删除元素的迭代器、引用和指针都会失效;

39.    不要保存end返回的迭代器

40.    Vertor和string类型的reserve(n)分配至少能容纳n个元素的内存空间,capacity()返回不需要重新分配内存空间容器可以保存多少个元素,shrink_to_fit()函数将capacity()减少为与size()相同的大小;

41.    调用shrink_to_fit()只是一个请求,标准库不保证退还内存;

42.    构造函数string s(cp,n)从cp指向的数组中拷贝前n个字符到s中,该数组无需以空字符结尾,而如果没有参数n,则cp必须是指向以空字符结束的数组;构造函数string s(s2,pos2,len2)表示s是s2从下标pos2开始len2个字符的拷贝,若无参数len2,表示拷贝到s2末尾;

43.    可以给substr传递一个开始位置和可选的计数值,返回一个string;

44.    除了接受迭代器的insert和erase版本外,string还提供了接受下标的版本。下标指出了开始删除的位置或是insert到该给定值之前的位置;

45.    String的成员函数append在string末尾进行插入操作,replace替换string内的部分字符串;

46.    String的搜索函数返回string::sizetype值,该类型是一个unsigned类型,并被初始化为-1,意味着npos等于任何string最大可能大小。因此,用一个int或其他带符号类型来保存这些函数的返回值不是一个好主意;

47.    String提供一组重载函数to_string(val),返回val的string表示,val可以是任何算数类型。stoi(s,p,b)等函数将string转换成数值,其中s表示待转换的字符串,p是一个size_t指针,用来保存s中第一个非数值字符的下标,b表示转换所用的基数,默认是0;

48.    除了顺序容器外,标准库还定义了三个顺序容器适配器:stack、queue和priority_queue;

49.    Stack接受一个顺序容器(除array或forward_list外),并使其操作起来像一个stack一样;

50.    栈默认基于deque实现,也可以在list或vector上实现,支持pop、push、emplace和top操作;

51.    我们不能在一个栈上调用它所封装的底层容器操作,也就是说不能在一个stack上调用push_back函数。栈定义在stack头文件中;

52.    Queue和priority_queue定义在queue头文件中,queue默认基于deque实现,priority_queue默认基于vector实现。注意back()函数只使用与queue,top()函数只适用于priority_queue。Pop()删除queue的首元素或priority_queue的最高优先级元素,但不返回该元素值;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值