C++标准库学习之 STL 序列式容器简单介绍

45 阅读3分钟

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;
    }

}

结果:

array0项数据是tsm
array1项数据是tsm1
array2项数据是tsm2
array3项数据是
array4项数据是
array5项数据是
array6项数据是
array7项数据是
array8项数据是
array9项数据是
从开始到 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)