C++与传统的C语言有一个很大的区别,就是新增了标准模板库 STL(Standard Template Library),它是 C++ 标准库的一部分,不需要单独安装,只需要 #include 对应的头文件即可。

本文将介绍STL中最基础的一个容器:vector

注意:本文仅从入门和实用角度介绍vector的用法。如有不严谨的地方欢迎指正!

引入头文件

在使用vector之前需要用#include <vector>来引入头文件。

如果你是竞赛选手,也可以用万能头#include <bits/stdc++.h>其中包含了<vector>

vector简介

vector可以理解为动态数组,它的大小会随着元素的增加而自动增大。下标从0开始,大小为n的vector的可用范围是[0, n - 1]

vector中不仅可以存放int, char等基础数据类型,还可以存放结构体、类等等。

但是一个vector中只能存放一种类型。

初始化

现在我们可以动手来生成一个vector试试:

vector<int> v(3, 5);//生成一个vector,其中有3个值为5的元素

二维数组后面会讲到。

遍历数组

既然是数组肯定少不了遍历嘛对吧~

思路是,先用v.size()获取vector的大小,然后用for循环遍历。

//v.size()返回值为unsigned int
for(int i = 0;i < v.size(); ++ i)
{
printf("%d", v[i]);
}
//结果为: 5 5 5

在C++11之后,可以使用auto关键字进行遍历,这个在后面会讲到。

插入元素

void push_back(const T& x)

vector有一个叫push_back()的方法,可以在数组尾部插入一个元素且令数组大小+1。

举个例子:

printf("%d\n", (int)v.size());//v.size() = 3
for(int i = 1;i <= 3; ++ i)v.push_back(i);
//现在 v 是: 5 5 5 1 2 3
//v.size() = 6

一般只向尾部插入元素,因为向其他位置插入元素的复杂度较高。

删除元素

void pop_back()删除最后一个元素。

void clear()清空vector,大小变为0

void erase(iter l, iter r)清空迭代器指向的区间$[l, r)$的元素。

v.pop_back();
//5 5 5 1 2
v.clear();
//null

其他的一般也用不着。

判断是否为空

bool empty()判断vector是否为空

vector<int> a(3);
//v.empty() == false
a.clear();
//v.empty() == true

一些常用函数(以下 v 指实例对象)

v.resize(n)将vector大小修改为n

v.begin()获取vector第一个元素的迭代器(指针)

v.end()获取vector最后一个元素的后一个位置的迭代器

v.rbegin()获取vector倒数第一个元素的迭代器(指针)

v.rend()获取vector倒数最后一个元素的后一个位置的迭代器

vector<int> v = {1, 2, 3}
cout << *v.begin() << '\n';//1
cout << *v.rbegin() << '\n';//3
cout << *(++ v.begin()) << '\n';//2

注意迭代器只能++或者--,不可以做 += n这种操作!

欢迎在右上角留下邮箱订阅我的博客哦!每周更新优质算法、计算机、互联网文章!

一些实例用法

下面介绍一些vector的实例化用法。

auto关键字遍历vector

有时候用auto关键字是一件很美的事儿,比如在写dfs的时候,不用管子节点的顺序,直接往下递归即可,用auto比用下标来写循环更安全。

需要注意一点,auto默认为浅拷贝,也就是复制出的一个副本来进行遍历,如果想要遍历vector本身,需要加个&,看以下的例子就明白了。

vector<int> v = {1, 5, 2, 4, 3};

for(auto i : v)i = 1;
//v = {1, 5, 2, 4, 3} for(auto &i : v)i = 1;
//v = {1, 1, 1, 1, 1}

当然你也自己尝试,把地址打出来看看。

而且,用&会比直接浅拷贝更快。

vector排序

给vector排序,需要先引入<algorithm>头文件:

#include <algorithm>
using namespace std;
int main()
{
vector<int> v = {5, 1, 3, 2, 4};
sort(v.begin(), v.end());//传入vector的首尾迭代器
//v = {1 2 3 4 5}
}

这样排序默认是升序的,可以利用reverse(iterator first, iterator last)进行翻转,写法和sort类似:

reverse(v.begin(), v.end());
//v = {5, 4, 3, 2, 1}

如果想在排序的时候一步到位排成降序,可以自定义比较函数,这里不再赘述。

排序并去重

在做离散化时经常用到vector,因为它可以方便的进行排序去重。

unique(iterator first, iterator last)可以将重复的元素移动到末尾的位置,前提是vector升序

对于vectorv = {1, 1, 2, 5}unique(v.begin(), v,end())的结果为:v = {1, 2, 5, 1}并返回v.begin() + 3表示去重后的终点位置(即有效数组的最后一个元素的下一个位置)。

vector<int> v = {1, 5, 2, 2, 1, 7, 7};
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
//v = {1, 2, 5, 7}

二维数组

起始就是把vector里面存的元素改为vector,就是套娃。

vector<vector<int> > v2;这样会产生一个大小为0的二维数组。

你可以通过resize()为每一个行设置一个大小,从而产生每一行都大小不同的二维数组:

    vector<vector<int> > v2;
v2.resize(3);
for(int i = 0;i < 3; ++ i)v2[i].resize(i + 1); /*
v = {
{0}
{0, 0}
{0, 0, 0}
};
有点神奇
*/

在做邻接表的时候经常使用vector,但是我习惯于开vector数组,即下面这种写法:

vector<int> g[maxn];

值得注意的一点(性能)

vector虽然可以动态开辟空间,但是这也是有代价的。

vector的空间不是一个一个开的,而是每当元素个数超出了当前的空间,就会开辟一个大小为原先两倍(也有说法是1.5倍)的空间,然后再将原本的数据拷贝过去,这就会增大vector的常数了。

所以如果你的vector大小或者范围已知,所以建议在初始化的时候就规定好大小。比如初始化的时候用vector<int> v(n),但是注意此时size()已经是n了。

[C++STL教程]1.vector容器是什么?实用教程来啦!超简单易懂,拿来就用的更多相关文章

  1. C++STL库中vector容器常用应用

    #include<iostream> #include<vector> #include<algorithm> using namespace std; int m ...

  2. C++ Daily《2》----vector容器的resize 与 reserve的区别

    C++ STL 库中 vector 容器的 resize 和 reserve 区别是什么? 1. resize 改变 size 大小,而 reserve 改变 capacity, 不改变size. 2 ...

  3. Vector 容器简单介绍

    # Vector STL简要介绍 关于STL中的vector容器,以下做一些相关介绍. #### vector 简要概述 vector 称作向量类,属于容器类,实现了动态的数组,用于元素数量变化的对象 ...

  4. C++ STL vector容器学习

    STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector, ...

  5. [转] C++的STL库,vector sort排序时间复杂度 及常见容器比较

    http://www.169it.com/article/3215620760.html http://www.cnblogs.com/sharpfeng/archive/2012/09/18/269 ...

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

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

  7. 标准模板库(STL)学习探究之vector容器

    标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...

  8. STL学习二:Vector容器

    1.Vector容器简介 vector是将元素置于一个动态数组中加以管理的容器. vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲). vector尾部添 ...

  9. STL学习系列二:Vector容器

    1.Vector容器简介 vector是将元素置于一个动态数组中加以管理的容器. vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲). vector尾部添 ...

  10. STL 查找vector容器中的指定对象:find()与find_if()算法

    1 从vector容器中查找指定对象:find()算法 STL的通用算法find()和find_if()可以查找指定对象,参数1,即首iterator指着开始的位置,参数2,即次iterator指着停 ...

随机推荐

  1. UNIT TWO

    声明 基于8086的寄存器共14个16位的,分别是 ax  bx  cx  dx  (通用寄存器) si  di  bp  sp    (基址与变址寄存器) cs  ss  ds  es   (段寄存 ...

  2. vue组件 子组件没有事件怎么 向父组件传递数据

    通过ref去接收值!!! 需求图片 代码实现 //----------父组件 <div class="fingerprint-bottom"> <el-tabs ...

  3. #硬件 #资讯 #科普 #短报 SSD价格跳水根本停不下来!不断刷出新低

    一份来自日本的统计显示,10~12月的初步统计显示,PC市场的指标产品中,256GB TLC颗粒SSD价格再次下跌2美元,现在只有29.5美元.这已经是该指标产品连续5个季度下跌,创下史上心底记录,同 ...

  4. CentOS6.x 7.x 8.x 服务器系统初始化设置

    服务器设置例子一.挂载硬盘1.磁盘分区fdisk -l #查看设备,一般可以看到设备名为/dev/xvdb,或者为/dev/vdb(阿里云io优化型)fdisk /dev/xvdb #对磁盘进行分区, ...

  5. ABAP开发面向对象---类

    今日学习ABAP面向对象里面的类,关于构造,继承,实现. 踩坑点:类有抽象的方法,类本身也需要是抽象的,故需要在类申明里面加上ABSTRACT关键字 学习资料为B站翱翔云天老师的 1 CLASS zc ...

  6. Redis5.0.4-集群(单机版)搭建

    最近尝试搭建了一下redis集群,这里记录一下,最后附上的是参考的博客地址. 安装C语言编译环境GCC yum install -y gcc-c++ 下载redis并编译安装 下载: wget htt ...

  7. VUE相关面试题目01

    一.MVVM是什么;      MVC:      MVVM的描述:           常见库实现数据双向绑定的效果:                     发布订阅模式;            ...

  8. termux搭建服务器方式

    pkg install vim apt update 安装debian系统apt install proot-distroproot-distro install debianproot-distro ...

  9. 前端复习之jQuery大全

    Jquery知识点梳理 梳理图摘自--https://www.cnblogs.com/859630097com/p/14433611.html [手机版]横屏观看,效果更佳 JavaScript类库: ...

  10. mysql80解决不支持中文的问题

    1.查看mysql80字符集 show variables like 'character_set%'; 2.修改server编码格式 在mysql安装目录下找到my-default.ini文件并复制 ...