1.可变长动态数组 vector
vector 支持随机访问迭代器,所有 STL 算法都能对 vector 进行操作,使用 vector,需要包含头文件vector
vector 容器中,根据下标随机访问某个元素的时间是常数,假设a是某个vector类型的对象,可以用a[n]或者a.at(n)访问随机位置。
在尾部添加一个元素的时间大多数情况下也是常数,在遇到空间不足需要重新分配内存空间时,把原有内容复制过去后再添加新的元素。碰到这种情况,添加新元素所花的时间就不是常数,而是和数组中的元素个数成正比。
遇到在中间插入或删除元素时,因为要移动多个元素,平均花费的时间和容器中的元素个数成正比
vector常用的成员函数
成员函数 | 作 用 |
---|---|
vector() | 无参构造函数,将容器初始化为空 |
vector(int n) | 将容器初始化为有 n 个元素 |
vector(int n, const T & val) | 假定元素的类型是 T,此构造函数将容器初始化为有 n 个元素,每 个元素的值都是 val |
vector(iterator first, iterator last) | first 和 last 可以是其他容器的迭代器。一般来说,本构造函数初始化的结果就是将 vector 容器的内容变成与其他容器上的区间 [first, last) —致 |
void clear() | 删除所有元素 |
bool empty() | 判断容器是否为空 |
void pop_back() | 删除容器末尾的元素 |
void push_back( const T & val) | 将 val 添加到容器末尾 |
int size() | 返回容器中元素的个数 |
int capacity() | 返回容器在分配新的存储空间之前能存储的元素总数 |
iterator begin() | 返回指向容器中第一个元素的迭代器 |
iterator end() | 返回指向容器中最后一个元素后面的位置的迭代器 |
iterator rbegin() | 返回指向容器中最后一个元素的反向迭代器 |
iterator rend() | 返回指向容器中第一个元素前面的位置的反向迭代器 |
T & front() | 返回容器中第一个元素的引用 |
T & back() | 返回容器中最后一个元素的引用 |
iterator insert(iterator i, const T & val) | 将 val 插入迭代器 i 指向的位置,返回 i |
iterator insert( iterator i, iterator first, iterator last) | 将其他容器上的区间 [first, last) 中的元素插入迭代器 i 指向的位置 |
iterator erase(iterator i) | 删除迭代器 i 指向的元素,返回值是被删元素后面的元素的迭代器 |
iterator erase(iterator first, iterator last) | 删除容器中的区间 [first, last) |
void swap( vector & v) | 将容器自身的内容和另一个同类型的容器 v 互换 |
void resize( size_type n) | 将容器的维度重新定义为n |
void resize( size_type n, T val) | 将容器的维度重新定义为n,每 个元素的值都是 val |
void reserve( size_type n) | 将容器在分配新的存储空间之前可储存最大总数重新定义为n |
二维vector数组定义:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<vector<int> > v(3); //v有3个元素,每个元素都是vector<int> 容器
//通过push_back确定维度
for(int i = 0;i < v.size(); ++i)
for(int j = 0; j < 4; ++j)
v[i].push_back(j);//每个元素为包含4个元素的vector<int> 容器
//通过resize()函数
for(int i = 0;i < v.size(); ++i)
v[i].resize(4);//每个元素为包含4个元素的vector<int> 容器
}
return 0;
}
2.双向链表list
使用 list 需要包含头文件 list,双向链表的每个元素中都有一个指针指向后一个元素,也有一个指针指向前一个元素
list 容器中,在已经定位到要增删元素的位置的情况下,增删元素能在常数时间内完成。
list 容器不支持根据下标随机存取元素
list 的构造函数和许多成员函数的用法都与 vector 类似,此处不再列举。除了顺序容器都有的成员函数外,list 容器还独有以下成员函数
成员函数或成员函数模板 | 作 用 |
---|---|
void push_front(const T & val) | 将 val 插入链表最前面 |
void pop_front() | 删除链表最前面的元素 |
void sort() | 将链表从小到大排序 |
void remove (const T & val) | 删除和 val 相等的元素 |
remove_if | 删除符合某种条件的元素 |
void unique() | 删除所有和前一个元素相等的元素 |
void merge(list & x) | 将链表 x 合并进来并清空 x。要求链表自身和 x 都是有序的 |
void splice(iterator i, list & x, iterator first, iterator last) | 在位置 i 前面插入链表 x 中的区间 [first, last),并在链表 x 中删除该区间。链表自身和链表 x 可以是同一个链表,只要 i 不在 [first, last) 中即可 |
3.deque
deque 也是顺序容器的一种,同时也是一个可变长数组。要使用 deque,需要包含头文件 deque。所有适用于 vector 的操作都适用于 deque。
deque 和 vector 有很多类似的地方。在 deque 中,随机存取任何元素都能在常数时间内完成(但慢于vector)。它相比于 vector 的优点是,vector 在头部删除或添加元素的速度很慢,在尾部添加元素的性能较好,而 deque 在头尾增删元素都具有较好的性能(大多数情况下都能在常数时间内完成)。它有两种 vector 没有的成员函数:
void push_front (const T & val); //将 val 插入容器的头部
void pop_front(); //删除容器头部的元素
来源:CSDN
作者:晴天stick
链接:https://blog.csdn.net/qq_42805483/article/details/103602962