STLvector的使用

2019-11-19  本文已影响0人  突击手平头哥

STLvector的使用

<a name="使用">vector介绍</a>

  vecotr是一个模板类, 提供各种类型的动态数组的功能; 具有如下特性: 1, 具有和数组一样的使用下标访问指定内容的功能; 2, 可以在末尾添加和删除元素; 3, 数组长度不做限制, 可以不断的添加元素, 不需要手动的管理内存. 以下均基于C++11

使用

头文件

#include <vector>
using namespace std;

需要引入vector头文件, 并且如果不使用std域的话, 需要以std::vector的方式使用

声明

std::vectro<int> std;

vector是一个模板类, 在初始化一个变量时需要显示的在<>中写明存储的类型。

初始化

#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;

int main()
{
    vector<int> vec1 = {1, 2, 3};
    vector<int> vec2{1,2, 3};

    printf("vec1 size: %d\n", vec1.size());
    printf("vec2 size: %d\n", vec2.size());
    return 0;
}

//结果:
vec1 size: 3
vec2 size: 3
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;

int main()
{
    vector<int> vec1;
    vector<int> vec2(10);
    vector<int> vec3(10, 100);

    printf("vec1 size: %d\n", vec1.size());
    printf("vec2 size: %d\n", vec2.size());
    printf("vec2[9]: %d\n", vec2[9]);
    printf("vec3 size: %d\n", vec3.size());
    printf("vec3[9]: %d\n", vec3[9]);
    return 0;
}

vec1 size: 0
vec2 size: 10
vec2[9]: 0
vec3 size: 10
vec3[9]: 100

可以选择指定长度/初始化值, 来初始化一个vector

#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;

int main()
{
    vector<int> vec1;
    vector<int> vec2(10, 99);
    vector<int> vec3(vec2);
    vector<int> vec4(vec2.begin(), vec2.begin() + 4);

    printf("vec1 size: %d\n", vec1.size());
    printf("vec2 size: %d\n", vec2.size());
    printf("vec2[9]: %d\n", vec2[9]);
    printf("vec3 size: %d\n", vec3.size());
    printf("vec3[9]: %d\n", vec3[9]);
    printf("vec4 size: %d\n", vec4.size());
    printf("vec4[9]: %d\n", vec4[3]);
    return 0;
}

//结果:
vec1 size: 0
vec2 size: 10
vec2[9]: 99
vec3 size: 10
vec3[9]: 99
vec4 size: 4
vec4[9]: 99

可以直接用另外一个vector来初始化新的vector, 也可以用另外vector的迭代器来初始化;
注意:使用迭代器初始化, 初始化情况是[a, b). 所以在vec4中, 我们进行了+4但是长度是4而不是5.

插入元素

#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;

int main()
{
    vector<int> vec2(10, 99);
    printf("vec2 size: %d\n", vec2.size());

    vec2.push_back(777);
    printf("vec2 size: %d\n", vec2.push_back(777););
    printf("vec2[9]: %d\n", vec2[10]);
    return 0;
}

//结果:
vec2 size: 10
vec2 size: 11
vec2[9]: 777

使用push_back在末尾插入元素呢?

#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;

int main()
{
    vector<int> vec2(10, 99);
    printf("vec2 size: %d\n", vec2.size());

    printf("vec2[0]: %d\n", vec2[0]);
    vec2.insert(vec2.begin(), 777);
    printf("vec2 size: %d\n", vec2.size());
    printf("vec2[0]: %d\n", vec2[0]);

    vec2.insert(vec2.end(), 3, 999);
    printf("vec2 size: %d\n", vec2.size());
    printf("vec2[13]: %d\n", vec2[13]);

    vector<int> vec3{888,888,888};
    vec2.insert(vec2.end(), vec3.begin(), vec3.end());
    printf("vec2 size: %d\n", vec2.size());
    printf("vec2[16]: %d\n", vec2[16]);

    return 0;
}

//结果:
vec2 size: 10
vec2[0]: 99
vec2 size: 11
vec2[0]: 777
vec2 size: 14
vec2[13]: 999
vec2 size: 17
vec2[16]: 888

使用迭代器作为索引; 可以单个插入, 可以插入指定个数的相同值(也可以仅指定个数插入0), 甚至可以使用另外一个vector的迭代器.

访问元素

  访问元素的方法有两种, 第一种如上使用下标访问, 第二种就是使用迭代器访问

#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;

int main()
{
    vector<int> vec2{1, 2, 3};
    printf("vec2[2]: %d\n", vec2[2]);

    vector<int>::iterator it = vec2.end() - 1;
    printf("vec2.end: %d\n", *it);


    return 0;
}

//结果:
vec2[2]: 3
vec2.end: 3

注意: end执行结尾的下一个; 通过上面的写法可以了解到iterator必然是vector的一个子类。 \color{red}{使用索引获得的值是一个引用, 对该值的使用会直接更改到容器内部}

删除元素(使用pop_back在末尾删除元素)

#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;

int main()
{
    vector<int> vec2(10, 99);
    printf("vec2 size: %d\n", vec2.size());

    vec2.pop_back();
    printf("vec2 size: %d\n", vec2.size());


    return 0;
}

//结果
vec2 size: 10
vec2 size: 9

可以看到, 长度减少了一个

其他


#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;

int main()
{
    vector<int> vec2;
    printf("vec2 size: %d, capactity: %d\n", vec2.size(), vec2.capacity());

    vec2.push_back(1);
    printf("vec2 size: %d, capactity: %d\n", vec2.size(), vec2.capacity());

    vec2.push_back(1);
    printf("vec2 size: %d, capactity: %d\n", vec2.size(), vec2.capacity());

    vec2.push_back(1);
    printf("vec2 size: %d, capactity: %d\n", vec2.size(), vec2.capacity());

    return 0;
}

//结果:
vec2 size: 0, capactity: 0
vec2 size: 1, capactity: 1
vec2 size: 2, capactity: 2
vec2 size: 3, capactity: 4

可以看到vector初始化时分配长度为0, 通常会预分配内存.

问题

#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;

int main()
{
    vector<int> vec2(3, 99);
    printf("vec2[3]: %d\n", vec2[3]);

    return 0;
}

//结果:
vec2[3]: 119945

不会崩溃但是, 获取的值时错误的;

vector的源码是怎么样的?(基于STLport)

\color{red}{看了一点点源码, 也一并记录一些知识点}

欢迎指正学习!

上一篇下一篇

猜你喜欢

热点阅读