《C++ Primer》读书笔记第九章-2-顺序容器操作 And vector增长问题

来源:互联网 发布:和重庆网络广播电视台 编辑:程序博客网 时间:2024/06/05 17:43

笔记会持续更新,有错误的地方欢迎指正,谢谢!

顺序容器操作

前面介绍的那些是所有容器(顺序容器+关联容器)都支持的,我们接下来介绍的只适用于顺序容器。

向顺序容器添加元素

list<int> a = {1, 2, 3}; //a为{1, 2, 3}。a.push_back(4); //a为{1, 2, 3, 4},array和forwar_list不支持。a.push_front(0); //a为{0, 1, 2, 3, 4},只有list,forward_list和deque支持。

insert允许我们在容器任意位置中插入多个元素,vector,deque,list,string都支持。

list<string> slist = {"Jay"};auto iter = slist.begin();slist.insert(iter, "Hello"); //将Hello添加到iter的前一个位置//也就是输出HelloJay

总结:调用insert会在前一个位置插入,相当于调用了push_front。
用一个对象来初始化或插入容器时,实际上放入的是拷贝,容器中元素与提供值的对象无任何关系。

访问元素

下标操作只支持string、vector、deque、array;访问成员函数返回的是引用。
每个顺序容器都有一个front(),返回首元素的引用;除forward_list之外的都有一个back(),返回尾元素的引用。

删除元素

clear和pop返回void,erase返回指向最后一个被删元素之后元素的迭代器。

vector<int> a = {1, 2, 3, 4, 5, 6};a.pop_front(); //删除首元素a.pop_back(); //删除尾元素//删除a中所有奇数auto it = a.begin();while(it != a.end()){    if(*it % 2)        it = a.eraser(it); //删除奇数        //erase()返回值是一个迭代器,指向删除元素下一个元素。    else        ++it;}//删除所有元素,两种方式a.clear();a.eraser(a.begin(), a.end());

特殊的forward_list操作

不常用,省略。

改变容器大小

除了array之外,我们可以用resize来改变容器大小:

  1. 如果当前大小大于所要求的的大小,容器后面的元素会被删除。
  2. 如果当前大小小于新大小,会填充指定值或默认初始值对象。
list<int> a(10, 42); //10个42a.resize(15); //后面再加5个0,是默认初始化的a.resize(25, -1); //后面再加10个-1a.resize(5); //从末尾删除20个元素,就剩5个42//如果是类类型,要么就有默认构造函数,要么就提供初始值

缩小容器,指向被删除元素的迭代器、引用和指针都会失效。

容器操作可能使迭代器失效

不保存尾后迭代器:在循环中插入删除deque、string、vector中的元素,应每次重新调用end()。
内容省略,希望规范使用容器,None失效!

vector增长问题

如果我在添加元素的时候,没有空间去容纳新元素应该怎么办呢?vector是这么做的:

  1. 把已有元素移动到新空间中
  2. 然后添加新元素
  3. 释放旧存储空间 那么问题又来了,我们的新空间要分配多大呢?一般来说貌似是旧空间的两倍,反正就是会预留一些空间。
成员函数 作用 c.size() 返回目前含有元素的数量 c.capacity() 返回所能保存的最大元素数量,只适用vector和string c.shrink_to_fit() 将capacity()减小为size()相同大小(适用vector、string、deque)
阅读全文
0 0
原创粉丝点击