0%

STL 容器

STL 容器

序列式容器(Sequence containers),此为可序群集,其中每个元素均有固定位置—取决于插入时机和地点,和元素值无关。如果你以追加方式对一个群集插入六个元素,它们的排列次序将和插入次序一致。STL提供了三个序列式容器:向量(vector)、双端队列(deque)、列表(list).

关联式容器(Associative containers),此为已序群集,元素位置取决于特定的排序准则以及元素值,和插入次序无关。如果你将六个元素置入这样的群集中,它们的位置取决于元素值,和插入次序无关。STL提供了四个关联式容器:集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)。

vector

可以看做可扩展的数组,末端可扩展,且末端插入快

需要include<vector>

deque

可以看做可双向扩展的vector

需要#include<queue>

list

双向链表,在内存中不连续存储。所以插入删除快,但不支持随机访问。

需要#include<list>

set

用红黑树实现,自动排序,元素不重复。

需要#include<set>multiset也是

multiset可以有重复元素

map

用红黑树实现,自动排序,元素不重复。

需要#inlcude<map>multimap也是

multimap可以有重复元素

用法

都能用迭代器遍历

各个容器用法差不多,下面以vector为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//创建
vector<T> v1; //创建类型为T的对象。默认构造函数 v1 为空。
vector<T> v2(v1); //v2 是 v1 的一个副本。
vector<T> v3(n, i); //v3 包含 n 个值为 i 的元素。
vector<T> v4(n); //v4 含有值初始化的元素的 n 个副本。

//大小
vec.size();

//访问元素
cout<<vec[0]<<endl;//用下标
//遍历一般用迭代器,参考迭代器那篇

//插入
vec.insert(vec.begin()+i,a); //在第i+1个元素前面插入a;
//尾部插入
vec.push_back(a);

//删除
vec.erase(vec.begin()+2); //删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j); //删除区间[ i,j-1] 区间从0开始

//清空
vec.clear();

map,set的插入用insert

1
2
3
4
5
// 第一种 用insert函數插入pair
mapStudent.insert(pair<int, string>(000, "student_zero"));

// 第二种 用insert函数插入value_type数据
mapStudent.insert(map<int, string>::value_type(001, "student_one"));

list,queue支持头部插入,用push_front()

可以使用sort()进行排序

merge()将两个容器合并,合并成功后会按从小到大的顺序排列;

如:lt1.merge(lt2); lt1容器中的元素全都合并到容器lt2中。

splice()函数也是合并,可以指定合并位置,但是不自动排序

资料

https://www.w3cschool.cn/cpp/cpp-i6da2pq0.html

https://www.cnblogs.com/linuxAndMcu/p/10254542.html

https://blog.csdn.net/sevenjoin/article/details/81943864

https://blog.csdn.net/weixin_41588502/article/details/87978490