vector介绍   vecotr是一个模板类, 提供...">
美文网首页
STLvector的使用

STLvector的使用

作者: 突击手平头哥 | 来源:发表于2019-11-19 21:25 被阅读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是一个模板类, 在初始化一个变量时需要显示的在<>中写明存储的类型。

初始化

  • 1 用一个{}包括的数组初始化
#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
  • 2 指定长度
#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

  • 3 以另外一个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.

插入元素

  • 1 在末尾插入元素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());

    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在末尾插入元素呢?

  • 2 在指定位置插入元素insert
#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

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

其他

  • 1 size()获取存储元素的个数
  • 2 capacity()获取容量大小, 动态属于通常预先分配一个较大的内存, 这就是这个实际纷飞内存的大小

#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, 通常会预分配内存.

问题

  • 1 如果访问越界会怎么样?
#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}{看了一点点源码, 也一并记录一些知识点}

  • 1 vector底层是使用连续空间数组实现的

  • 2 在vector初始化时, 生成的空间大小=指定的大小(指定长度初始化); 之后, 如果新增长度小于原有长度, 长度=原有长度*2, 否则是原有长度+新的长度

  • 3 vector的迭代器实质就是一个指定类型的指针

  • 4 在删除数据时, 根据需要调用析构函数, 清空空间但不释放; 插入数据时也根据需要调用构造函数.

欢迎指正学习!

相关文章

  • STLvector的使用

    STLvector的使用 vector介绍   vecotr是一个模板类, 提供...

  • C++ STL容器基本使用

    一. 顺序容器: 按顺序存储数据; 插入速度快,查找相对较慢。 vector 在最后插入数据;STLvector类...

  • iconfont的使用(下载使用)

    1、下载文件 2、在生命周期中引入项目 beforeCreate () { var domModule = ...

  • Gson的使用--使用注解

    Gson为了简化序列化和反序列化的过程,提供了很多注解,这些注解大致分为三类,我们一一的介绍一下。 自定义字段的名...

  • 记录使用iframe的使用

    默认记录一下----可以说 这是我第一次使用iframe 之前都没有使用过; 使用方式: 自己开发就用了这几个属...

  • with的使用

    下面例子可以具体说明with如何工作: 运行代码,输出如下

  • this的使用

    什么是this? this是一个关键字,这个关键字总是返回一个对象;简单说,就是返回属性或方法“当前”所在的对象。...

  • this的使用

    JS中this调用有几种情况 一:纯粹的函数调用 这是函数的最通常用法,属于全局性调用,因此this就代表全局对象...

  • ==的使用

    积累日常遇到的编码规范,良好的编码习惯,持续更新。。。 日常使用==用于判断的时候,习惯性将比较值写前面,变量写后...

  • this的使用

    1.默认绑定,就是函数立即执行。 函数立即执行就是指向window,但是如果是node环境,就是指向全局conso...

网友评论

      本文标题:STLvector的使用

      本文链接:https://www.haomeiwen.com/subject/klngictx.html