STL 容器总结(一)

本文总结了STL中的三种顺序容器——vector、list和deque的基本操作和特性。vector以连续内存存储元素,适合随机访问但插入、删除中间元素效率低;list采用双向链表,插入删除高效但随机访问效率低;deque在两端插入删除高效,适合作为queue底层实现。定义容器常用方法包括push_back/pop_back,以及针对list和deque的push_front/pop_front。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、所有容器的共通操作
1、equality(==) 和 inequality(!=) 运算符, 返回 true 或者 false。
2、assignment(=) 运算符,将某个容器复制给另一个容器。
3、empty() 会在容器没有任何元素的时候返回 true,否则 false。
4、size() 返回目前容器中持有元素的数目。
5、clear() 清除所有元素

二、 每个容器都提供了begin() 、end()、 insert()、 erase() 函数
1、begin() 返回一个 iterator,指向容器的第一个元素。
2、end() 返回一个iterator,指向容器的最后一个元素的下一个位置。
3、insert() 将单一或某个范围内的元素插入容器内。
4、erase() 将容器内单一或某个范围内的元素删除。

三、 顺序性容器

vector

1、vector 和 list 是最主要的两个顺序性容器。
2、vector 以一块连续的内存来存放元素,对 vector 进行随机访问,比较有效率,vector 内的每个元素都被存储在距离起始点的固定偏移位置上。如果将元素插入任意位置,而不是末端,那么效率将很低,因为插入位置右端的每一个元素,都必须被复制一份,然后依次向右移动。同样道理,删除 vector 内最后一个元素以外的任意元素,同样缺乏效率。

list

list 是双向链接,而非连续内存来存储内容,因此可以执行前进或者后退操作。list 中每个元素包含三个字段:value、back 指针、front 指针。在 list 的任意位置插入和删除都颇具效率,因为 list 本身只需设定 back 和 front 指针即可。如果对 list 进行随机访问的操作,则效率欠佳,因为每次访问都必须遍历介于其中的所有元素。

deque

deque 和 vector 行为比较相似,都以连续内存来存储元素。和 vector 不同的是,deque 对于前端元素的插入和删除效率更高,末端亦同。如果我们需要在容器前端插入元素,并执行末端的删除操作,deque 比较理想。(标准库的 queue 以 deque 作为底部存储元素)

定义容器的方法
# 产生空的容器:
list<string> slist;
vector<int> ivec;

# 产生特定大小的容器:
list<int> ilist(1024);
vector<string> svec(32);

# 产生特定大小的容器,并制定初值:
list<int> ilist(10, -11);
vector<string> svec(12, "hello");

# 通过一对iterator产生容器:
int ia[6] = {1, 2, 3, 4, 5, 6};
vector<int> ivec(ia, ia+6);

# 复制容器
list<string> slist(1, "hello");
list<string> slist1(slist);

push_back() 会在末尾插入一个元素
pop_back() 会删除末尾的最后一个元素
除此之外,list 和 deque (不包括 vector) 还提供了 push_front() 和 pop_front() 。
pop_back() 和 pop_front() 这两个操作函数并不会返回被删除的元素值。因此,如果要读取最前端的元素,使用front() ,读取末端元素,使用back() 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值