容器大小操作
- empty()
返回bool值,容器为空时true,非空时false - max_size()
返回一个大于或等于该类型容器所能容纳的最大元素个数(即size()一定不超过max_size())。 size()
返回容器中元素的个数,但forward_list不支持size()
原因如下:
forward_list的设计目标是达到与最好的手写单向链表的数据结构性能相当,而实现size()需要计算或者保存,为了避免这个额外开销,forward_list没有实现size().我们可以用distance(flist.begin(),flist.end())来获取单链表中元素的个数
向顺序容器删添元素
- push_back(t)
- emplace_back(args)
向尾端加入一个元素,t为元素的值,args为元素的构造参数
emplace构造一个元素而不是拷贝
struct St
{
int x, y;
St(int _x,int _y):x(_x),y(_y){}
};
vector<St> vi;
vi.emplace_back(1,2); //调用构造函数生成St对象然后插入容器尾
St st1(2,3);
vi.push_back(st1); //只接受容器值类型
- push_front(t)
- emplace_front(args)
在容器头部插入元素,其余同上
- insert(p,t)
- emplace(p,args)
在迭代器p 之前的位置插入一个元素t或者由args创建
返回新插入元素的第一个元素的迭代
- erase(p)
- erase(b,e)
删除迭代器p所指的位置的元素,返回最后一个被删除元素 之后元素 的迭代器
IMPORTANT : 对于erase(b,e)返回的并不是e,因为执行删除操作之后,e迭代器已经失效了
- insert(p,n,t)
- insert(p,b,e)
- insert(p,il)
在迭代器p 之前的位置插入n个元素t,或迭代器b,e之间的元素,或一个初始化列表
返回新插入元素的第一个元素的迭代器
forward_list的特殊操作
forward_list 不支持 push_back 和 emplace_back
对于insert和emplace也有自己的特殊版本
在顺序容器中某个位置删除或添加一个元素时,需要获取该位置前驱的迭代器,因为forward_list是单向链表,不能直接获取前驱,所以标准库中定义的是 insert_after 和 emplace_after 、 erase_after,对指定位置后面一个位置进行操作
insert_after 及 emplace_after与上面的相似
特别的,erase_after(p)删除p之后的元素,erase_after(b,e)删除的元素范围如下(b,e之间不包括b)
访问元素
对于连续存储容器(vector \ string \ deque \ array)可用下标访问
c[i]
所有容器都可以通过迭代器访问元素
*_iterator
还可以方便的访问容器的首尾元素
c.front()
c.back()
同样地,forward_list没有定义back()
以上的所有访问返回的都是引用,可以修改元素的值。
改变容器的大小
- resize(n,t)
- resize(n)
如果 n < c.size(),则大于n的部分会被丢弃
如果 n > c.size(),则会创建不足的元素
对于指定了t的,创建值为t的元素
对于未指定的,如果元素是内置类型则执行值初始化
如果元素是类类型,且该类没有默认构造函数,则必须为其指定一个t