[C++STL教程]1.vector容器是什么?实用教程来啦!超简单易懂,拿来就用
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容器是什么?实用教程来啦!超简单易懂,拿来就用的更多相关文章
- C++STL库中vector容器常用应用
#include<iostream> #include<vector> #include<algorithm> using namespace std; int m ...
- C++ Daily《2》----vector容器的resize 与 reserve的区别
C++ STL 库中 vector 容器的 resize 和 reserve 区别是什么? 1. resize 改变 size 大小,而 reserve 改变 capacity, 不改变size. 2 ...
- Vector 容器简单介绍
# Vector STL简要介绍 关于STL中的vector容器,以下做一些相关介绍. #### vector 简要概述 vector 称作向量类,属于容器类,实现了动态的数组,用于元素数量变化的对象 ...
- C++ STL vector容器学习
STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector, ...
- [转] C++的STL库,vector sort排序时间复杂度 及常见容器比较
http://www.169it.com/article/3215620760.html http://www.cnblogs.com/sharpfeng/archive/2012/09/18/269 ...
- 跟我一起学STL(2)——vector容器详解
一.引言 在上一个专题中,我们介绍了STL中的六大组件,其中容器组件是大多数人经常使用的,因为STL容器是把运用最广的数据结构实现出来,所以我们写应用程序时运用的比较多.然而容器又可以序列式容器和关联 ...
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- STL学习二:Vector容器
1.Vector容器简介 vector是将元素置于一个动态数组中加以管理的容器. vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲). vector尾部添 ...
- STL学习系列二:Vector容器
1.Vector容器简介 vector是将元素置于一个动态数组中加以管理的容器. vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲). vector尾部添 ...
- STL 查找vector容器中的指定对象:find()与find_if()算法
1 从vector容器中查找指定对象:find()算法 STL的通用算法find()和find_if()可以查找指定对象,参数1,即首iterator指着开始的位置,参数2,即次iterator指着停 ...
随机推荐
- UNIT TWO
声明 基于8086的寄存器共14个16位的,分别是 ax bx cx dx (通用寄存器) si di bp sp (基址与变址寄存器) cs ss ds es (段寄存 ...
- vue组件 子组件没有事件怎么 向父组件传递数据
通过ref去接收值!!! 需求图片 代码实现 //----------父组件 <div class="fingerprint-bottom"> <el-tabs ...
- #硬件 #资讯 #科普 #短报 SSD价格跳水根本停不下来!不断刷出新低
一份来自日本的统计显示,10~12月的初步统计显示,PC市场的指标产品中,256GB TLC颗粒SSD价格再次下跌2美元,现在只有29.5美元.这已经是该指标产品连续5个季度下跌,创下史上心底记录,同 ...
- CentOS6.x 7.x 8.x 服务器系统初始化设置
服务器设置例子一.挂载硬盘1.磁盘分区fdisk -l #查看设备,一般可以看到设备名为/dev/xvdb,或者为/dev/vdb(阿里云io优化型)fdisk /dev/xvdb #对磁盘进行分区, ...
- ABAP开发面向对象---类
今日学习ABAP面向对象里面的类,关于构造,继承,实现. 踩坑点:类有抽象的方法,类本身也需要是抽象的,故需要在类申明里面加上ABSTRACT关键字 学习资料为B站翱翔云天老师的 1 CLASS zc ...
- Redis5.0.4-集群(单机版)搭建
最近尝试搭建了一下redis集群,这里记录一下,最后附上的是参考的博客地址. 安装C语言编译环境GCC yum install -y gcc-c++ 下载redis并编译安装 下载: wget htt ...
- VUE相关面试题目01
一.MVVM是什么; MVC: MVVM的描述: 常见库实现数据双向绑定的效果: 发布订阅模式; ...
- termux搭建服务器方式
pkg install vim apt update 安装debian系统apt install proot-distroproot-distro install debianproot-distro ...
- 前端复习之jQuery大全
Jquery知识点梳理 梳理图摘自--https://www.cnblogs.com/859630097com/p/14433611.html [手机版]横屏观看,效果更佳 JavaScript类库: ...
- mysql80解决不支持中文的问题
1.查看mysql80字符集 show variables like 'character_set%'; 2.修改server编码格式 在mysql安装目录下找到my-default.ini文件并复制 ...