STL 是 C++ 标准去中非常重要的一环,包含了非常多的内容,从这篇文章开始,就开始接触他了,今天先来简单的介绍一下其中的序列式容器
序列式容器的特点是 每个元素都有固定的位置,取决于数据插入的时机和地点,与元素无关
Vector
/**
*
* 向量 在 <vector> 包下
* -------------------------------------------
* | | | | | | | | | | -->
* -------------------------------------------
* 在内存空间内存是连续的,并且可以向后追加数据, 大小不固定
* 只能添加到队尾,如果想要插入中间,则插入点之后的所有数据都需要移动
* 访问可以直接根据 vector[index] index 索引访问元素
*/
void tsm_vector(){
vector<int> tsm_vec;
for (int i = 0; i < 10; ++i) {
tsm_vec.push_back(i*i);
cout<< "vector 添加第"<<i <<"项成功" <<endl;
}
cout<< "------------------------------------"<<endl;
for (int i = 0; i < tsm_vec.size(); ++i) {
cout <<"vector 第" <<i <<"项数据是"<<tsm_vec[i] <<endl;
}
}
结果:
添加第0项成功
添加第1项成功
添加第2项成功
添加第3项成功
添加第4项成功
添加第5项成功
添加第6项成功
添加第7项成功
添加第8项成功
添加第9项成功
------------------------------------
vector 第0项数据是0
vector 第1项数据是1
vector 第2项数据是4
vector 第3项数据是9
vector 第4项数据是16
vector 第5项数据是25
vector 第6项数据是36
vector 第7项数据是49
vector 第8项数据是64
vector 第9项数据是81
从开始到 vector 耗时0(ms)
deque
/**
*
* 双向队列 在 <deque> 包下
* -------------------------------------------
* <-- | | | | | | | | | | -->
* -------------------------------------------
* 在内存空间内存是连续的,并且可以向两端追加数据, 大小不固定
* 数据添加到两次速度快,如果想要插入中间,则插入点之后的所有数据都需要移动
* 访问可以直接根据 deque[index] index 索引访问元素
*/
void tsm_deque(){
deque<float> deque;
for (int i = 0; i < 5; ++i) {
deque.insert(deque.begin(),i*1.1f);
}
for (int i = 0; i < 5; ++i) {
deque.push_back(i*2.2f);
}
for (int i = 0; i < deque.size(); ++i) {
cout <<"deque 第" <<i <<"项数据是"<<deque[i] <<endl;
}
}
结果:
deque 第0项数据是4.4
deque 第1项数据是3.3
deque 第2项数据是2.2
deque 第3项数据是1.1
deque 第4项数据是0
deque 第5项数据是0
deque 第6项数据是2.2
deque 第7项数据是4.4
deque 第8项数据是6.6
deque 第9项数据是8.8
从开始到 deque 耗时0(ms)
array
/**
* 数组 在 <array> 包下
* ---------------------------------------------
* | | | | | | | | | | | |
* ---------------------------------------------
* 在内存空间内存是连续的,大小在初始化后就已经被固定饿了,
*
* 访问可以直接根据 array[index] index 索引访问元素
*/
void tsm_array(){
array<string,10> ary={"tsm","tsm1","tsm2"};
for (int i = 0; i < ary.size(); ++i) {
cout <<"array 第" <<i <<"项数据是"<<ary[i] <<endl;
}
}
结果:
array 第0项数据是tsm
array 第1项数据是tsm1
array 第2项数据是tsm2
array 第3项数据是
array 第4项数据是
array 第5项数据是
array 第6项数据是
array 第7项数据是
array 第8项数据是
array 第9项数据是
从开始到 array 耗时0(ms)
从结果可以看出来,在 array 中即使没有数据,当前的内配也是被分配好的,并且是可以正常访问的
list
/**
* list 双向链表 在 <list> 包下
*
* --- --- ---
* | | --> | | --> | |
* | | <-- | | <-- | |
* --- --- ---
*
* list 中的内存是不连续的,所以无法通过 index 索引到指定数据
* 他的每一个节点都保存着他的前导元素和后继元素的指针,如果想要访问第10个数据,必须从
* 开始位置遍历,但是插入或者删除是非常方便的
*
*/
void tsm_list(){
list<char> list;
for (int i = 'a'; i <= 'z'; ++i) {
list.push_back(i);
}
while (!list.empty()){
//从前向后
cout<< list.front() <<endl;
list.pop_front();
// 从后向前
// cout<< list.back() <<endl;
// list.pop_back()
}
}
结果:
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
forward_list
/**
* 单向链表 在 <forward_list> 包下
*
* --- --- ---
* | | --> | | --> | |
* --- --- ---
*
* 他的功能是 list 的删减版,只能操作前面,他的出现是为了节省内存
*
*/
void tsm_forward_list(){
forward_list<int> forwardList;
for (int i = 0; i < 10; ++i) {
forwardList.push_front(i*i);
}
while (!forwardList.empty()){
cout<<forwardList.front()<<endl;
forwardList.pop_front();
}
}
结果:
81
64
49
36
25
16
9
4
1
0
从开始到 forward_list 耗时0(ms)