您的位置:首页 > 编程语言 > C语言/C++

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

2017-09-19 23:09 281 查看
笔记会持续更新,有错误的地方欢迎指正,谢谢!

顺序容器操作

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

向顺序容器添加元素

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来改变容器大小:

如果当前大小大于所要求的的大小,容器后面的元素会被删除。

如果当前大小小于新大小,会填充指定值或默认初始值对象。

list<int> a(10, 42); //10个42
a.resize(15); //后面再加5个0,是默认初始化的
a.resize(25, -1); //后面再加10个-1
a.resize(5); //从末尾删除20个元素,就剩5个42
//如果是类类型,要么就有默认构造函数,要么就提供初始值


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

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

不保存尾后迭代器:在循环中插入删除deque、string、vector中的元素,应每次重新调用end()。

内容省略,希望规范使用容器,None失效!

vector增长问题

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

把已有元素移动到新空间中

然后添加新元素

释放旧存储空间 那么问题又来了,我们的新空间要分配多大呢?一般来说貌似是旧空间的两倍,反正就是会预留一些空间。

成员函数作用
c.size()返回目前含有元素的数量
c.capacity()返回所能保存的最大元素数量,只适用vector和string
c.shrink_to_fit()将capacity()减小为size()相同大小(适用vector、string、deque)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ c++primer 读书笔记