STL之顺序容器

 转(总结): 顺序容器主要包括vector、list、deque,分别在头文件<vector>、<list>和<deque>中定义。

1.容器创建
C<T>  c;               //创建空容器,适用于所有容器
C<T>  c(c2);         //创建c2的副本,c和c2必须是同类型容器和元素,适用所有容器
C<T>  c(b, e);       //容器类型和元素类型可兼容即可,但是根据实验,貌似不行
C<T>  c(n, t);        //n个t值元素,t必须是T类型或可转为T类型,适用于顺序容器
C<T>  c(n);           //n个使用初始化值的元素,适用于顺序容器,一般是0

2.迭代器操作
*iter
iter->mem
++iter
iter++
--iter
iter--
iter1 == iter2
iter1 != iter2
--------------------------
iter + n                   //只有vector和deque支持算术运算和关系运算,list不支持
iter – n
iter1 += iter2
iter1 -= iter2
iter1 – iter2
iter1 > iter2
iter1 < iter2
iter1 <= iter2
iter1 >= iter2

3.内置类型
C<T>::size_type
C<T>::iterator
C<T>::const_iterator                //注意与const C<T>::iterator不同
C<T>::reverse_iterator
C<T>::const_reverse_iterator
C<T>::value_type
C<T>::reference                     //左值类型,即value_type&
C<T>::const_reference           //const value_type&

4.基本操作
void  c.push_back(t);
void  c.push_front(t);        //只适用list、deque

void  c.insert(p, n ,t);
void  c.insert(p, b, e);
C<T>::iterator  c.insert(p, t);

C<T>::size_type  c.size();
C<T>::size_type  c.max_size();   //最多可容纳的元素,与类型有关,总存储空间固定
bool  c.empyt();
void  c.resize(n);
void  c.resize(n, t);                   //重调c的大小,新添加的元素值使用t值

c[n]                                        //只适用于vector、deque容器
C<T>::value_type  c.at(n);      //只适用于vector、deque容器,防止越界

C<T>::iterator  c.erase(p);
C<T>::iterator  e.erase(b, e);
void  c.clear();
void  c.pop_back();
void  c.pop_front();               //只适用于list、deque容器

c1 = c2                          //重设,要求c1和c2类型相同,元素类型相同
void  c1.assign(b, e);      //重设,b、e不能是c1中的迭代器,类型兼容即可
void  c1.assign(n, t);       //重设
void  c1.swap(c2);        //c1和c2类型必须相同,且迭代器不失效


容器适配器包括queue、priority_queue、stack。


stack默认基于deque容器实现,也可以建立在vector、list和deque上;
queue默认基于deque容器实现,也可以建立在list和deque上;
priority_queue默认基于vector上,也可以建立在vector和deque上。
stack<string, vector<string> >  a;
stack<string, vector<string> >  a(c);

1.内置类型
C<T>::size_type
C<T>::value_type
C<T>::container_type

2.stack的操作
bool  s.empty();
C<T>::size_type  s.size();
void s.pop();                   //删除不返回
C<T>::value_type  s.top();      //返回但不删除
void s.push(value);

3.queue和priority_queue的操作
void  q.empty();
C<T>::size_type  q.size();
void  q.pop();                         //删除队首,不返回
C<T>::value_type  q.front();   //返回队首,不删除,只适用于queue
C<T>::value_type  q.back();   //返回队尾,不删除,只适用于queue
C<T>::value_type  q.top();    //返回最高优先级的元素,不删除,只适用于priority_type
void  q.push(value);               //对queue是在队尾压入,对priority_queue是适当位置插入

### STL顺序容器的种类 STL 提供了几种常用的顺序容器,这些容器以严格的线性形式组织元素。以下是主要的顺序容器及其特点: #### 1. `vector` `vector` 是一种动态数组,支持随机访问,并将元素存储在连续的内存空间中。由于其内部实现方式,在中间插入或删除元素较为耗时[^1]。然而,它提供了高效的尾部插入和删除操作。 #### 2. `deque` (双端队列) `deque` 支持在两端快速添加或移除元素,类似于双向链表的行为,但在某些情况下仍能提供随机访问的支持。尽管它的底层实现可能不是完全连续的内存块,但它仍然允许通过索引访问元素[^1]。 #### 3. `list` (双向链表) `list` 使用双向链表来存储元素,这意味着它可以高效地在任意位置执行插入和删除操作。不过,由于它是链式结构,无法像 `vector` 和 `deque` 那样支持随机访问[^4]。 #### 4. `forward_list` (单向链表) `forward_list` 是 C++11 引入的一种优化版本的单向链表。为了提高效率,它省略了一些功能(如不支持反向遍历),甚至没有内置的 `size()` 方法,从而减少了不必要的开销[^1]。 #### 5. `array` (静态数组) 虽然严格来说 `std::array` 不完全是传统意义上的“顺序容器”,因为它是一个固定大小的容器模板类;但从行为上看,它也可以被视作一种简单的顺序容器,适用于已知大小的情况下的场景[^4]。 综上所述,常见的 STL 顺序容器主要包括:`vector`, `deque`, `list`, `forward_list` 及 `array`. ```cpp #include <iostream> #include <vector> #include <deque> #include <list> #include <forward_list> #include <array> int main() { std::vector<int> vec = {1, 2, 3}; std::deque<int> dq = {4, 5, 6}; std::list<int> lst = {7, 8, 9}; std::forward_list<int> flst = {10, 11, 12}; std::array<int, 3> arr = {13, 14, 15}; // 打印 vector for(auto v : vec){ std::cout << v << ' '; } std::cout << '\n'; return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值