vector的本质还是数组,但是可以动态的增加和减少数组的容量(当数组空间内存不足时,都会执行: 分配新空间-复制元素-释放原空间),首先先讲讲vector和数组的具体区别

一、vector和数组的区别

  1. vector封装了很多数组没有的方法,可以更方便的处理数据;数组相比起vector就少了很多
  2. 二维vector在声明中可以方便的初始化;数组需要用cstring库里面的memset函数来初始化(且只能直接初始化为0或-1)
  3. 一维vector一维数组;内存都是连续的
  4. 二维vector中,第二维的内存不是连续的,但是第一维是连续的;二维数组中内存是连续的

下面是样例代码

#include<cstdio>
#include<vector>
#include<cstring>
using namespace std; int main()
{
// 普通数组的声明并且初始化
int a_arr[3];
memset(a_arr, -1, sizeof(a_arr));
// vector可以更方便的初始化 ,且可以初始化为任何值
vector<int> a_vector(3,50); for(int i=0;i<3;i++)
printf("%d ",a_arr[i]);
printf("\n");
for(int i=0;i<3;i++)
printf("%d ",a_vector[i]);
printf("\n");
printf("\n一维上数组和vector的内存都是连续的\n");
// 一维上数组和vector的内存都是连续的
for(int i=0;i<sizeof(a_arr)/sizeof(int);i++)
printf("%d ", &a_arr[i]);
printf("\n");
for(int i=0;i<a_vector.size();i++)
printf("%d ", &a_vector[i]);
printf("\n"); int b_arr[3][3];
memset(*b_arr, -1, sizeof(b_arr));
// vector<vector <int > > b_vector(3,(3)); 自动初始化为0
vector<vector <int > > b_vector(3,vector<int>(3,50)); // 初始化为50
printf("\n二维上数组和vector的内存有差异\n");
// 地址是连续的
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
printf("b_arr[%d][%d]的地址为:%d\n", i, j, &b_arr[i][j]);
// 地址不是连续的
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
printf("b_vector[%d][%d]的地址为:%d\n", i, j, &b_vector[i][j]);
// 由于地址不是连续的所以下面的访问方式vector不适用
for(int i=0;i<9;i++)
printf("%d ",b_arr[0][i]);
printf("\n");
for(int i=0;i<9;i++)
printf("%d ",b_vector[0][i]);
// 至于为什么vector越界访问的第一个值(也就是vector[0][3])总是0,我猜测是为了更快的push,顺便也初始化了
return 0;
}

好了,看到了他们的区别现在再来讲讲vector什么时候用?怎么用?用的时候要注意些什么?

 二、什么时候用

  在需要使用数组而且不能确定数组的容量,但是又不想开太大的普通数组的时候,可以使用vector。

 三、怎么用

v.capacity(); //容器容量

v.size(); //容器大小

v.at(int idx); //用法和[]运算符相同

v.push_back(); //尾部插入

v.pop_back(); //尾部删除

v.front(); //获取头部元素

v.back(); //获取尾部元素

v.begin(); //头元素的迭代器

v.end(); //尾部元素的迭代器

v.insert(pos,elem); //pos是vector的插入元素的位置

v.insert(pos, n, elem) //在位置pos上插入n个元素elem

v.insert(pos, begin, end);

v.erase(pos); //移除pos位置上的元素,返回下一个数据的位置

v.erase(begin, end); //移除[begin, end)区间的数据,返回下一个元素的位置

reverse(pos1, pos2); //将vector中的pos1~pos2的元素逆序存储

怎么用转自:https://blog.csdn.net/weixin_41588502/article/details/87978490

 四、用的时候要注意什么?

  1. vector自带了insert和erase来再vector中任意位置来插入元素,但是离尾部越远效率越低,所以需要频繁的在元素中任意位置插入删除元素可以选用其它的容器,比如map
  2. 还有就是通过下标访问的时候不要越界访问。

最详细STL(一)vector的更多相关文章

  1. 跟我一起学STL(2)——vector容器详解

    一.引言 在上一个专题中,我们介绍了STL中的六大组件,其中容器组件是大多数人经常使用的,因为STL容器是把运用最广的数据结构实现出来,所以我们写应用程序时运用的比较多.然而容器又可以序列式容器和关联 ...

  2. STL中vector、list、deque和map的区别

    1 vector     向量 相当于一个数组    在内存中分配一块连续的内存空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capac ...

  3. C++的STL中vector内存分配方法的简单探索

    STL中vector什么时候会自动分配内存,又是怎么分配的呢? 环境:Linux  CentOS 5.2 1.代码 #include <vector> #include <stdio ...

  4. 带你深入理解STL之Vector容器

    C++内置了数组的类型,在使用数组的时候,必须指定数组的长度,一旦配置了就不能改变了,通常我们的做法是:尽量配置一个大的空间,以免不够用,这样做的缺点是比较浪费空间,预估空间不当会引起很多不便. ST ...

  5. C++STL之Vector向量详解,用法和例子 一起学习 一起加油

                                                                                    C++ STL之vector用法总结 1 ...

  6. 【转】STL中vector、list、deque和map的区别

    1.vector 向量 相当于一个数组 在内存中分配一块连续的内容空间进行存储.支持不指定vector大小的存储.STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacity()函数 ...

  7. C++-STL:vector用法总结

    目录 简介 用法 1. 头文件 2. vector的声明及初始化 3. vector基本操作 简介 vector,是同一类型的对象的集合,这一集合可看作可变大小的数组,是顺序容器的一种.相比于数组,应 ...

  8. 从零开始写STL—容器—vector

    从0开始写STL-容器-vector vector又称为动态数组,那么动态体现在哪里?vector和一般的数组又有什么区别?vector中各个函数的实现原理是怎样的,我们怎样使用会更高效? 以上内容我 ...

  9. 【C++】STL,vector容器操作

    C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板.标准库vector类型使用需要的头 ...

  10. STL之vector常用函数笔记

    STL之vector常用函数笔记 学会一些常用的vector就足够去刷acm的题了 ps:for(auto x:b) cout<<x<<" ";是基于范围的 ...

随机推荐

  1. 解析一个HTML字符串

    存在问题 来自用户输入,一个文件或一个网站的HTML字符串,你可能需要对它进行解析并取其内容,或校验其格式是否完整,或想修改它.怎么办?jsonu能够帮你轻松解决这些问题 解决方法 使用静态Jsoup ...

  2. NameNode&Secondary NameNode 工作机制

    NameNode&Secondary NameNode 工作机制 NameNode: 1.启动时,加载编辑日志和镜像文件到内存 2.当客户端对元数据进行增删改,请求NameNode 3.Nam ...

  3. Java 并发:Lock 框架详解

    摘要: 我们已经知道,synchronized 是java的关键字,是Java的内置特性,在JVM层面实现了对临界资源的同步互斥访问,但 synchronized 粒度有些大,在处理实际问题时存在诸多 ...

  4. Java HdAcm1174

    空间一般直线的方程是:(x-x0)/a=(y-y0)/b=(z-z0)/c,这是一条过(x0,y0,z0),方向矢量为{a,b,c}的直线.假设已知点的坐标是A(e,f,g),过A点,且与{a,b,c ...

  5. 【SpringMVC】获取请求参数

    通过ServletAPI获取 test.html <a th:href="@{/testServletAPI(username='admin',password=123456)}&qu ...

  6. 高并发HHTP实践

    当今,正处于互联网高速发展的时代,每个人的生活都离不开互联网,互联网已经影响了每个人生活的方方面面.我们使用淘宝.京东进行购物,使用微信进行沟通,使用美图秀秀进行拍照美化等等.而这些每一步的操作下面, ...

  7. ---Docker学习随笔---基础管理部分---

    docker是什么?提供快速.高效.轻量的微服务平台 1. 背景介绍突破虚拟机对资源占用高.启动时间长.镜像存储大.集群规模小等限制,摆脱操作系统级的隔离级别,实现进程级管理.主要专用名词: chro ...

  8. Docker容器管理——进入容器命令

    一.docker exec 命令(这个命令的本质就是让docker exec替我在容器执行一条命令,当执行的命令是/bin/bash的时候就是执行一条登陆命令,则会进入容器内部) 1.让docker ...

  9. Spring Cloud Apollo 实践

    接上一篇Windows下安装Apollo的常见问题,安装完毕后试着看怎么来使用一下. 首先到管理页面创建一个新的应用: 创建成功后会自动跳转到应用的维护界面,如下图所示: 新增一个配置信息来进行后续的 ...

  10. Python - 面向对象编程 - 实战(6)

    需求 设计一个培训机构管理系统,有总部.分校,有学员.老师.员工,实现具体如下需求: 有多个课程,课程要有定价 有多个班级,班级跟课程有关联 有多个学生,学生报名班级,交这个班级对应的课程的费用 有多 ...