笔记会持续更新,有错误的地方欢迎指正,谢谢!
顺序容器操作
前面介绍的那些是所有容器(顺序容器+关联容器)都支持的,我们接下来介绍的只适用于顺序容器。
向顺序容器添加元素
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) |