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. long ? 的使用和理解

    Dictionary<string, object> dic = new Dictionary<string, object>(); long lg = 12345; dic[ ...

  2. SpringBoot2.0 防止XSS攻击

    一:什么是XSS XSS攻击全称跨站脚本攻击,是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中. 你可以自己做个简单尝试: 1. 在任何一个表单内,你输 ...

  3. linux的一般命令------附加

    1.cat /etc/redhat-release             查看linux版本 2. ps -ef|grep ssh                        查看进程在不在 3. ...

  4. AOP的底层实现-CGLIB动态代理和JDK动态代理

    AOP是目前Spring框架中的核心之一,在应用中具有非常重要的作用,也是Spring其他组件的基础.它是一种面向切面编程的思想.关于AOP的基础知识,相信多数童鞋都已经了如指掌,我们就略过这部分,来 ...

  5. 刷题-力扣-剑指 Offer II 055. 二叉搜索树迭代器

    剑指 Offer II 055. 二叉搜索树迭代器 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kTOapQ 著作权归领扣网络所有 ...

  6. 证明:(a,[b,c]) = [(a,b),(a,c)]

    这题是潘承洞.潘承彪所著<初等数论>(第三版)第一章第5节里一个例题,书中采用算术基本定理证明,并指出要直接用第4节的方法来证是较困难的. 现采用第4节的方法(即最大公约数理论里的几个常用 ...

  7. TCP/IP以及Socket聊天室带类库源码分享

    TCP/IP以及Socket聊天室带类库源码分享 最近遇到个设备,需要去和客户的软件做一个网络通信交互,一般的我们的上位机都是作为客户端来和设备通信的,这次要作为服务端来监听客户端,在这个背景下,我查 ...

  8. noip模拟44

    A. Emotional Flutter 直接将所有黑块平移到 \([1-k,0]\) 的区间即可,然后找有没有没被覆盖过的整点 注意特判 \(1-k\) 以及 \(0\) 的可行性,考场这里写挂成 ...

  9. openswan专栏序言

    openswan专栏序言 "一杯茶,一包烟,一个bug解一天!!!". ​ 2020年春季,正值新冠病毒在全球肆虐之际,美国的疫情已经相当的严峻,每天仍以3万速度狂奔.而国内的疫情 ...

  10. linux常用查询命令

    1 **系统** 2 # uname -a # 查看内核/操作系统/CPU信息 3 # head -n 1 /etc/issue # 查看操作系统版本 4 # cat /proc/cpuinfo # ...