关于vector的常见用法详解

目录
  • vector的定义
  • vector容器内元素的访问
    • 一、通过下标访问
    • 二、通过迭代器访问
  • vector常用函数
  • vector的常见用途

vector翻译为向量,但是这里使用“变长数组”的叫法更容易理解,也即“长度根据需要而自动改变的数组”。在考试题中,有时会碰到只用普通数组会超内存的情况,这种情况使用vector会让问题的解决便捷许多。另外, vector还可以用来以邻接表的方式储存图,这对无法使用邻接矩阵的题目(结点数太多)、又害怕使用指针实现邻接表的读者是非常友好的写法也非常简洁。

需要的头文件:

#include <vector>

需要的其他东西:

using namespace std;

vector的定义

vector的定义的格式:

vector<typename> name;

上面这个定义其实相当于是一维数组name[ SIZE ],只不过其长度可以根据需要进行变化,
比较节省空间,说通俗了就是"边长数组"。

和一维数组一样,这里的typename 可以是任何基本类型,例如: int 、double 、char、结构体等,也可以是STL标准容器,
例如 vector 、set、queue等。需要注意的是,如果typename也是一个STL容器,定义的时候要记得在 >> 符号之间加上空格,
因为一些使用C++ 11之前标准的编译器会把它视为移位操作,导致编译错误。
例子:

#include<cstdio>
#include<vector>
using namespace std;
struct student
{
	int age;
	char name[20];
};
int main(void)
{
	vector<int> a;
	vector<double> b;
	vector<char> c;
	vector<student> d;
	return 0;
} 

如果typename 是vector,就是下面这样定义:

vector< vector<int> > name;//  >>之间要加空格

可以很容易联想到二维数组的定义,即其中一维是一个数组的数组。那么二维vector数组也是一样的,
即Arrayname[]中的每一个元素都是vector。
初学者可以把二维vector 数组当作两个维都可变长的二维数组理解。

定义vector数组的方法:

vector<typename> Arrayname[arraySize];

这样Arrayname[0] ~ Arrayname[ arraySize - 1 ] 中的每一个元素都是一个vector容器。

与vector<vector<int> > name 不同的是,这种写法的一维长度已经固定为arraySize,另一维才是"变长"的

vector容器内元素的访问

vector一般有两种访问方式 , 通过下标访问或通过迭代器访问。

一、通过下标访问

和访问普通的数组是一样的,对一个定义为vector vi 的容器来说
直接访问vi[ index ] 即可(如vi[0]、vi[1])。当然这里的下标是从0 到 vi.size()-1。
访问这个范围外的元素可能会出错。

二、通过迭代器访问

迭代器( iterator ) 可以理解为一种类似指针的东西,其定义是:

vector<typename>::iterator it;  //可以迭代器就是定义一个 vector类型的指针

vector<typename>::iterator it;  //可以迭代器就是定义一个 vector类型的指针

这样it 就是一个vector:: iterator型的变量,其中 typename 就是定义vector时填写的类型。
下面是typename为int和 double 类型的举例:

vector<int> ::iterator it;
vector<double> ::iterator it;

这样就得到了迭代器it,并且可以通过 *it 来访问vector里的元素

从这里可以看出 vi [ i ] 和 * ( vi.begin() + i )是等价的。
上面中的begin()函数的作用为 : 取 a的首元素地址。
end()函数是取a的尾元素地址的下一个地址。end()作为迭代器末尾标志,不存储任何元素。

除此之外,迭代器还实现了两种自加操作: ++it 和 it++
于是有了另一种遍历vector中元素的写法:

需要注意的是: vector的迭代器不支持 it < v1.end() 写法,因此循环条件只能用 it != vi.end()

最后需要指出,在常用STL容器中,只有在vector和string中,才允许使用vi.begin()+3这种迭代器加上整数的写法。

vector常用函数

(1) push_back()
顾名思义,push_back(x)就是在vector后面添加一个元素x,时间复杂度为O(1)。

(2) pop_back()
pop_back()用以删除vector的尾元素,时间复杂度为O(1)。
注意: pop_back()函数是没有参数的

(3) size()
size()用来获得vector中元素的个数,时间复杂度为O(1)。size()返回的是unsigned类型,
不过一般来说用%d不会出很大问题,这一点对所有STL容器都是一样的。
例子:

(4) clear()
clear()用来清空vector中的所有元素,时间复杂度为O(N),其中N为vector中元素的个数。

(5) insert()
inesrt(it,x)用来向vector的任意迭代器it处插入一个元素x,时间复杂度O(N)。

(6)erase()
erase()有两种方法: 删除单个元素、删除一个区间内的所有元素。时间复杂度都为O(N)。
①删除单个元素
erase(it) 即删除迭代器为it处的元素。

②删除一个区间内的所有元素
erase(first,last)即删除 [ first , last) 内的所有元素。

上面的说法可以直到,如果要删除这个vector内的所有元素,
正确的写法应该是v1.erase( v1.begin() , v1.end() )。
这正如前面说过,v1.end()就是尾元素地址的下一个地址。
当然,更方便的清空vector的方法是使用v1.clear()。

vector的常见用途

(1)存储数据

  • vector本身可以作为数组使用,而且在一些元素个数不确定的场合可以很好地节省空间。
  • 有些场合需要根据一些条件把部分数据输出在同一行,数据中间用空格隔开。
  • 由于输出数据的个数不确定的,为了更方便地处理最后一个满足条件地数据后面不输出额外地空格,可以先用vector记录所有需要输出的数据,然后一次输出。

(2)用邻接表存储图
使用vector实现邻接表可以让一些对指针不太熟悉的读者有一个比较方便的写法。

到此这篇关于vector的常见用法详解的文章就介绍到这了,更多相关vector的常见用法内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ vector的用法小结

    c++ vector用法 C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板. 标准库vector类型使用需要的头文件:#include <vector>.vector 是一个类模板.不是一种数据类型,vector<int>是一种数据类型.Vector的存储空间是连续的,list不是连续存储的. 一. 定义和初始化 vector< typeName > v1

  • C++中stack、queue、vector的用法详解

    一.栈(stack) 引入头文件 #include<stack> 常用的方法 empty() 堆栈为空则返回真 pop() 移除栈顶元素 push() 在栈顶增加元素 size() 返回栈中元素数目 top() 返回栈顶元素 3.实例代码 #include<iostream> #include<stack> using namespace std; int main(){ //创建栈 s stack<int> s; //将元素压入栈 for(int i=0;

  • 深入理解C++中的vector类的用法及特性

    //<vector> template < class T, class Alloc = allocator<T> > class vector; 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence container).跟任意其它类型容器一样,它能够存放各种类型的对象.可以简单的认为,向量是一个能够存放任意类型的动态数组. vector类为内置数组提供了一种替代表示,与string类一样 vector 类是随标准 C++引入的标准库的一部分 ,为

  • C++ vector数组用法及解析

    目录 一.什么是vector数组 二.vector的基本操作 vector数组的初始化 向vector中插入元素 删除元素 遍历数组 利用vector创建动态二维数组 一.什么是vector数组 vector是向量类型 vector数组是可以存放任意数据类型的动态数组 和普通数组类似,可以通过下标对数组中的元素进行引用 二.vector的基本操作 使用vector数组要在头文件中加 #include<vector> vector数组的声明 vector<int> vec;//声明一

  • C++中vector的用法实例解析

    本文实例展示了C++中的vector用法,分享给大家供大家参考.具体如下: 一.概述 vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector是一个容器,它能够存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,可以动态改变大小. 例如: // c语言风格 int myHouse[100] ; // 采用vector vector<int> vecMyHouse(100); 当如上定义后,vecMyHouse

  • c++容器list、vector、map、set区别与用法详解

    c++容器list.vector.map.set区别 list 封装链表,以链表形式实现,不支持[]运算符. 对随机访问的速度很慢(需要遍历整个链表),插入数据很快(不需要拷贝和移动数据,只需改变指针的指向). 新添加的元素,list可以任意加入. vector 封装数组,使用连续内存存储,支持[]运算符. 对随机访问的速度很快,对头插元素速度很慢,尾插元素速度很快 新添加的元素,vector有一套算法. map 采用平衡检索二叉树:红黑树 存储结构为键值对<key,value> set 采用

  • C++ Vector用法详解

    vector是C++标准模版库(STL,Standard Template Library)中的部分内容.之所以认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单的说:vector是一个能够存放任意类型的动态数组,能够增加和压缩数据. 使用vector容器之前必须加上<vector>头文件:#include<vector>; vector属于std命名域的内容,因此需要通过命名限定:using std::vector;也可以直接使用全局的命名空间方式:using nam

  • 关于vector的常见用法详解

    目录 vector的定义 vector容器内元素的访问 一.通过下标访问 二.通过迭代器访问 vector常用函数 vector的常见用途 vector翻译为向量,但是这里使用“变长数组”的叫法更容易理解,也即“长度根据需要而自动改变的数组”.在考试题中,有时会碰到只用普通数组会超内存的情况,这种情况使用vector会让问题的解决便捷许多.另外, vector还可以用来以邻接表的方式储存图,这对无法使用邻接矩阵的题目(结点数太多).又害怕使用指针实现邻接表的读者是非常友好的写法也非常简洁. 需要

  • Linux 命令head和tail常见用法详解

    head和tail是一组想对应的命令,默认分别显示文件的开头和末尾10行记录. head head 命令可以将一段文本的开头一部分输出到标准输出. head命令既可以处理文本文件也可以处理标准输入. 基本应用 处理文本文件: head input.txt 当有多个文件输入时,head会顺序处理并输出: head input1.txt input2.txt 处理标准输入: ls | head 当没有其他参数时,head默认输出前10行,当然,head有各种参数. 可选参数 -n: 输出的行数 例如

  • C++ typedef常见用法详解

    目录 typedef的4种常见用法: typedef的4种用法详解 两大陷阱 typedef 与 #define的区别 typedef的4种常见用法: 给已定义的变量类型起个别名 定义函数指针类型 定义数组指针类型 为复杂的声明定义一个新的简单的别名 总结一句话:“加不加typedef,类型是一样的",这句话可以这样理解: 没加typedef之前如果是个数组,那么加typedef之后就是数组类型: 没加typedef之前如果是个函数指针,那么加typedef之后就是函数指针类型: 没加typed

  • MySQL存储过程概念、原理与常见用法详解

    本文实例讲述了MySQL存储过程概念.原理与常见用法.分享给大家供大家参考,具体如下: 1.存储过程的概念 在一些语言中,如pascal,有一个概念叫"过程"procedure,和"函数"function,在php中,没有过程,只有函数. 过程:封装了若干条语句,调用时,这些封装体执行 函数:是一个有返回值的"过程" 总结:过程是一个没有返回值的函数 在MySQL中: 我们把若干条sql封装起来,起个名字 -- 过程 把此过程存储在数据库中 --

  • MySQL查询条件常见用法详解

    本文实例讲述了MySQL查询条件常见用法.分享给大家供大家参考,具体如下: 条件 使用where子句对表中的数据筛选,结果为true的行会出现在结果集中 语法如下: select * from 表名 where 条件; 例: select * from students where id=1; where后面支持多种运算符,进行条件的处理 比较运算符 逻辑运算符 模糊查询 范围查询 空判断 比较运算符 等于: = 大于: > 大于等于: >= 小于: < 小于等于: <= 不等于:

  • python数据库操作mysql:pymysql、sqlalchemy常见用法详解

    本文实例讲述了python数据库操作mysql:pymysql.sqlalchemy常见用法.分享给大家供大家参考,具体如下: 相关内容: 使用pymysql直接操作mysql 创建表 查看表 修改表 删除表 插入数据 查看数据 修改数据 删除数据 使用sqlmary操作mysql 创建表 查看表 修改表 删除表 插入数据 查看数据 修改数据 删除数据 首发时间:2018-02-24 23:59 修改: 2018-06-15,发现自己关于pymysql写了对于数据的操作示例,但没有写表结构的示例

  • C++中auto_ptr智能指针的用法详解

    智能指针(auto_ptr) 这个名字听起来很酷是不是?其实auto_ptr 只是C++标准库提供的一个类模板,它与传统的new/delete控制内存相比有一定优势,但也有其局限.本文总结的8个问题足以涵盖auto_ptr的大部分内容. auto_ptr是什么? auto_ptr 是C++标准库提供的类模板,auto_ptr对象通过初始化指向由new创建的动态内存,它是这块内存的拥有者,一块内存不能同时被分给两个拥有者.当auto_ptr对象生命周期结束时,其析构函数会将auto_ptr对象拥有

  • 基于C++中setiosflags()的用法详解

    cout<<setiosflags(ios::fixed)<<setiosflags(ios::right)<<setprecision(2); setiosflags 是包含在命名空间iomanip 中的C++ 操作符,该操作符的作用是执行由有参数指定区域内的动作:   iso::fixed 是操作符setiosflags 的参数之一,该参数指定的动作是以带小数点的形式表示浮点数,并且在允许的精度范围内尽可能的把数字移向小数点右侧:   iso::right 也是se

随机推荐