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. UWP使用命名管道与桌面程序通信 (C#)

    关于UWP的历史,其起源是Microsoft在Windows 8中引入的Metro apps.(后来又被称作Modern apps, Windows apps, Universal Windows A ...

  2. myScript调研,电子手写板使用,纯干货

    第二天进公司,就叫我调研myScript作为手写板的可行性,又不能不做,哎~ myScript效果十分的奈斯,前端用canvas手写的文字.数学字符,都可以识别然后转换,不知道myScript是不是你 ...

  3. Google Chrome浏览器必备的20个插件

    Google Chrome浏览器虽然与火狐浏览器有所区别,不过他们都是很开放的浏览器产品,所以也有许多有用的插件,这些插件对于日常生活与网络冲浪都很有用,比如网银,炒股等. Google Chrome ...

  4. MySQL主库手动复制至从库

    原文转自:https://www.cnblogs.com/itzgr/p/10233932.html作者:木二 目录 一 主库手动复制至从库 1.1 Master主库锁表 1.2 主库备份 1.3 从 ...

  5. Microsoft Remote Desktop 通过 .rdp 文件登录

    最近在淘宝上买了「市场洞察」子账号,说是子账号,其实是需要登录到他们的 Windows 服务器上才能用的.并且子账号也是 5-6 个人共用的,且不说远程服务器很老又有延迟,经常是我想添加一个监控店铺或 ...

  6. 我的第一个npm包:wechat-menu-editor 基于Vue的微信自定义菜单编辑器

    wechat-menu-editor 微信自定义菜单编辑器 前言 在做微信公众号相关开发时,基本上会去开发的功能就是微信自定义菜单设置的功能,本着不重复造轮子的原则,于是基于Vue封装的一个微信自定义 ...

  7. ElasticSearch集群的安装(windows)

    首先尽量保持你的磁盘空间足够大,比如你下载的软件的放在D盘,D盘尽量保持10G以上,还有C盘也差不多10G以上比较保险 一.下载 1)目前我下载的版本是elasticsearch-7.12.0-win ...

  8. Jenkins(7)- 解决Linux下忘记Jenkins密码

    如果想从头学起Jenkins的话,可以看看这一系列的文章哦 https://www.cnblogs.com/poloyy/category/1645399.html admin密码未更改情况下 进入\ ...

  9. openswan源码ubantu下编译、安装、基本环境搭建

    openswan的编译过程 文章目录 openswan的编译过程 1. 下载源码: 2. 在虚拟机上解压后编译: 2.1 查看INSTALL文件 2.2 查看文件buildlin.sh文件 3. 查看 ...

  10. C#中的文本到语音

    本演示说明了如何使用c#.net Windows Forms应用程序中的system.speech库将文本转换为语音.Microsoft .NET框架提供System.Speech.Synthesis ...