[详解-vector] C++必知必会 vector常用各种操作解析

news/2024/11/16 21:53:06/

vector 是 C++ 标准库中的一个动态数组容器,它可以自动管理内存大小,可以在运行时根据需要动态增长或缩小。它是一个非常常用且强大的容器,用于存储一系列元素。下面详细介绍 vector 的使用方法,并提供相应的代码案例。

1.包含头文件:

首先,使用需要引入头文件 <vector>

#include <vector>

2.创建 vector 对象:

直接使用 vector 模板类来创建一个 vector 对象。可以创建存储特定类型元素的 vector,格式为: vector<数据类型> 名字。例如:

vector<int> myVector; // 创建一个存储整数的 vector,名字为myVector
vector<char> myVector; // 创建一个存储字符的 vector,名字为myVector
vector<string> myVector; // 创建一个存储字符串的 vector,名字为myVector
……

3.初始化一维 vector 对象:

3.1 vector < int > myVector;

此时myVector中没有任何元素,直接进行访问会报错。

可以使用 myVector.resize(num),或者myVector.resize(n, num) 来初始化。

①前者是使用num个0来初始化;

	vector < int > myVector;myVector.resize(5);//输出内容是:0 0 0 0 0for (int i = 0; i < myVector.size(); i++) {cout << myVector[i] << " ";}cout << endl;

②后者是使用n个num来初始化。

	vector < int > myVector;myVector.resize(5,10);//输出内容是:10 10 10 10 10for (int i = 0; i < myVector.size(); i++) {cout << myVector[i] << " ";}cout << endl;

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

这种方法在初始化后就进行了赋值,此时myVector.size() == 5。如果使用myVector.resize(num)来修改的话:①对于num<myVector.size()的情况,如num==3,会丢弃myVector最后的4和5;

	vector < int > myVector = { 1,2,3,4,5 };myVector.resize(3);//输出内容是:1 2 3for (int i = 0; i < myVector.size(); i++) {cout << myVector[i] << " ";}cout << endl;

②对于num>myVector.size()的情况,如num==7,会用0来填充没有赋值的部分,此处就是最后两个位置;

	vector < int > myVector = { 1,2,3,4,5 };myVector.resize(7);//输出内容是:1 2 3 4 5 0 0for (int i = 0; i < myVector.size(); i++) {cout << myVector[i] << " ";}cout << endl;

3.3 vector < int > myVector(num); 或者 vector < int > myVector(n,num);

类似于resize的用法

3.4 vector < int > myVector(testVector); 或者 vector < int > myVector = testVector;

这种方法是使用另外一个数组来初始化myVector,注意,这里的testVector也必须是vector类型

①vector < int > myVector(testVector);

	vector < int > testVector = { 1,2,3,4,5 };vector < int > myVector(testVector);//输出内容是:1 2 3 4 5for (int i = 0; i < myVector.size(); i++) {cout << myVector[i] << " ";}cout << endl;

②vector < int > myVector = testVector;

	vector < int > testVector = { 1,2,3,4,5 };vector < int > myVector = testVector;//输出内容是:1 2 3 4 5for (int i = 0; i < myVector.size(); i++) {cout << myVector[i] << " ";}cout << endl;

3.5使用指针初始化一维vector;

vector < int > myVector (*p, *q); 使用另外一个数组的指针来初始化v,这里既可以使用vector的指针,也可以使用普通数组的指针。

	int arr[5] = { 1,2,3,4,5 };vector<int> myVector = { 1,2,3,4 };//输出内容是:1 2 3vector<int> vector1(arr, arr + 3);for (int i = 0; i < vector1.size(); i++)cout << vector1[i] << " ";   cout << endl;//输出内容是:2 3vector<int> vector2(myVector.begin() + 1, myVector.end() - 1);for (int i = 0; i < vector2.size(); i++)cout << vector2[i] << " ";   	cout << endl;

4.初始化二维 vector 对象:

4.1 vector < vector < int > > myVector;

和一维数组一样,这里的myVector中没有任何元素,myVector.size() == 0,直接访问会报错。


①可以先使用myVector.resize(n)来初始化这个二维数组的第一维,然后使用一个for循环再初始化第二维。此时myVector中的元素都是空格,不是0。

	vector < vector < int > > myVector;myVector.resize(5);for (int i = 0; i < 5; i++) {myVector.resize(5);}// 输出的是一片空格 for (int i = 0; i < myVector.size(); i++) {for (int j = 0; i < myVector[i].size(); i++) {cout << myVector[i][j] << " ";}cout << endl;}cout << endl;

4.2 vector < vector < int > > myVector(n, testVector);

可以直接使用n和testVector来初始化myVector,但是testVector需要是vctor类型

	vector <int> testVector(4,1);vector < vector < int > > myVector(4, testVector);//输出内容是: 4行4列共16个1for (int i = 0; i < myVector.size(); i++) {for (int j = 0; j < myVector[i].size(); j++) {cout << myVector[i][j] << " ";}cout << endl;}cout << endl;

4.3 通过复制其他vector的方式

类似于3.4,这里不在赘述

4.4 使用指针初始化二维vector

既可以使用vector的指针,也可以使用普通数组的指针。

①使用vector的指针

	vector<int> vector1 = { 1,2,3,4 };vector<vector<int>> vector2(4, vector1);vector<vector<int>> myVector(vector2.begin(), vector2.end());for (int i = 0; i < myVector.size(); i++) {for (int j = 0; j < myVector[i].size(); j++)cout << myVector[i][j] << " ";cout << endl;}//输出内容是:/*1 2 3 41 2 3 41 2 3 41 2 3 4*/

②使用普通数组的指针

	int arr[4][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16} };vector<vector<int>> myVector;for (int i = 0; i < 4; i++) {// 使用指针 arr[i] 初始化每一行vector<int> row(arr[i], arr[i] + 4);myVector.push_back(row);}for (int i = 0; i < myVector.size(); i++) {for (int j = 0; j < myVector[i].size(); j++)cout << myVector[i][j] << " ";cout << endl;}//输出内容是:/*1 2 3 45 6 7 89 10 11 1213 14 15 16*/

5. 访问 vector 中的元素:

直接使用下标操作符 [] 来访问 vector 中特定索引的元素。

	vector<int> myVector = { 100,200,300,400 };cout << myVector[0] << endl; // 100cout << myVector[1] << endl; // 200cout << myVector[2] << endl; // 300cout << myVector[3] << endl; // 400

6.获取 vector 的大小:

使用size()或者capacity()函数

	vector<int> myVector = { 100,200,300,400, 500 };cout << myVector.size() << endl; // 5cout << myVector.capacity() << endl; // 5

7.向 vector 中添加元素:

使用 push_back() 函数将元素添加到 vector 的末尾,默认且只能添加到末尾。

	vector<int> myVector = { 1,2,3,4 };myVector.push_back(100);myVector.push_back(200);myVector.push_back(300);//输出内容是:1 2 3 4 100 200 300for (int i = 0; i < myVector.size(); i++) {cout << myVector[i] << " ";}cout << endl;

8.向 vector 中插入元素:

使用 insert() 函数来在指定位置插入元素。需要提供插入位置的迭代器和要插入的元素值。

	vector<int> myVector = { 100,200,300,400,500,600 };vector<int>::iterator it;it = myVector.begin(); //索引为0的位置myVector.insert(it, 111); //向索引为0的位置插入元素111//输出内容为:111 100 200 300 400 500 600for (int i = 0; i < myVector.size(); i++) {cout << myVector[i] << " ";}cout << endl;it = myVector.begin() + 2; //索引为2的位置myVector.insert(it, 222); //向索引为2的位置插入元素222//输出内容为:111 100 222 200 300 400 500 600for (int i = 0; i < myVector.size(); i++) {cout << myVector[i] << " ";}cout << endl;it = myVector.end(); //myVector的末尾myVector.insert(it, 999); //向myVector的末尾插入元素999//输出内容为:111 100 222 200 300 400 500 600 999for (int i = 0; i < myVector.size(); i++) {cout << myVector[i] << " ";}cout << endl;

9.删除 vector 中的元素:

使用 pop_back() 函数删除 vector 末尾的元素,默认且只能删除末尾的元素 。

	vector<int> myVector = { 100,200,300,400,500 };myVector.pop_back();myVector.pop_back();cout << myVector.size() << endl; // 3//输出内容是:100 200 300for (int i = 0; i < myVector.size(); i++) {cout << myVector[i] << " ";}cout << endl;

10.删除 vector 中指定位置的元素:

使用 erase() 函数来删除指定位置的元素,需要提供删除位置的迭代器。

	vector<int> myVector = { 100,200,300,400,500,600 };vector<int>::iterator it;it = myVector.begin(); //索引为0的位置myVector.erase(it); //删除索引为0的位置的元素//输出内容为:200 300 400 500 600for (int i = 0; i < myVector.size(); i++) {cout << myVector[i] << " ";}cout << endl;it = myVector.begin() + 2; //索引为2的位置myVector.erase(it); //删除索引为2的位置的元素//输出内容为:200 300 500 600for (int i = 0; i < myVector.size(); i++) {cout << myVector[i] << " ";}cout << endl;

11.删除 vector 中指定数值的元素:

使用 remove() 函数来删除指定值的元素。

①如果能在目标vector中找到该数值的元素,直接删除

	vector<int> myVector = { 100,200,300,400,500,600 };myVector.erase(remove(myVector.begin(), myVector.end(), 500), myVector.end()); //删除数值为500的元素myVector.erase(remove(myVector.begin(), myVector.end(), 300), myVector.end()); //删除数值为300的元素//输出内容为:100 200 400 600for (int i = 0; i < myVector.size(); i++) {cout << myVector[i] << " ";}cout << endl;

②如果目标vector中找不到该数值的元素,不做任何操作,不会报错

	vector<int> myVector = { 100,200,300,400,500,600 };myVector.erase(remove(myVector.begin(), myVector.end(), 555), myVector.end()); //删除数值为500的元素myVector.erase(remove(myVector.begin(), myVector.end(), 333), myVector.end()); //删除数值为300的元素//输出内容为:100 200 300 400 500 600for (int i = 0; i < myVector.size(); i++) {cout << myVector[i] << " ";}cout << endl;

12.修改 vector 中的元素:

直接使用下标操作符 [] 来修改 vector 中特定索引的元素。

	vector<int> myVector = { 100,200,300,400,500 };myVector[0] = 111; // 修改索引为0的元素myVector[1] = 222; // 修改索引为0的元素//输出内容是:111 222 300 400 500for (int i = 0; i < myVector.size(); i++) {cout << myVector[i] << " ";}cout << endl;

13.查找 vector 中的元素:

使用 find() 函数来查找指定值的元素,或者使用迭代器来遍历查找。

①使用 find() 函数查找:

	vector<int> myVector = { 100,200,300,400,500,600 };vector<int>::iterator it = find(myVector.begin(), myVector.end(), 500);//输出内容为:目标元素的索引为: 4if (it != myVector.end()) {cout << "目标元素的索引为: " << std::distance(myVector.begin(), it) <<endl;}else {cout << "没有找到" << std::endl;}

②使用迭代器遍历查找:

	vector<int> myVector = { 100,200,300,400,500,600 };bool found = false;int valueToFind = 300;//输出内容为:目标元素的索引为: 2for (std::vector<int>::iterator it = myVector.begin(); it != myVector.end(); ++it) {if (*it == valueToFind) {cout << "目标元素的索引为: " << distance(myVector.begin(), it) << endl;found = true;break;}}if (!found) {std::cout << "没有找到" << std::endl;}

14.清空 vector 中的元素:

使用clear() 函数可以清空 vector 中的所有元素。

	vector<int> myVector = { 100,200,300,400,500,600 };cout << myVector.size() << endl; // 6myVector.clear();cout << myVector.size() << endl; // 0

15.使用索引遍历 vector 中的元素:

使用for循环和索引来遍历 vector 中的元素。

	vector<int> myVector = { 100,200,300,400,500,600 };//输出内容是:100 200 300 400 500 600for (int i = 0; i < myVector.size(); i++) {cout << myVector[i] << " ";}cout << endl;

16.使用迭代器遍历 vector:

三种方式,推荐第三种,更简洁。

①第一种通过迭代器遍历的方法

        vector<int> myVector = { 100,200,300,400,500,600 };//输出内容是:100 200 300 400 500 600for (vector<int>::iterator it = myVector.begin(); it != myVector.end(); it++) {cout << *it << " ";}cout << endl;

②第二种通过迭代器遍历的方法

for (int it : myVector){},这里需要指定myVector中元素的类型,因为我定义的myVector元素类型是int,这里就使用int

	vector<int> myVector = { 100,200,300,400,500,600 };//输出内容是:100 200 300 400 500 600for (int it : myVector) {cout << it << " ";}cout << endl;

③第三种通过迭代器遍历的方法(推荐)

for (auto it : myVector){},这里直接使用auto,不需要根据myVector中元素的类型改变

	 vector<int> myVector = { 100,200,300,400,500,600 };//输出内容是:100 200 300 400 500 600for (auto it : myVector) {cout << it << " ";}cout << endl;

文章已同步至某乎

[详解-vector] C++必知必会 vector常用各种操作解析


http://www.ppmy.cn/news/1014587.html

相关文章

PIC单片机配置字的设置

PIC单片机配置字的设置 PIC系列单片机&#xff0c;其芯片内部大都设置有一个特殊的程序存储单元&#xff0c;地址根据不同的单片机而定&#xff0c;此存储单元用来由单片机用户自由配置或定义单片机内部的一些功能电路单元的性能选项&#xff0c;所以被称之为系统配置字。目前…

Docker desktop使用配置

1. 下载安装 https://www.docker.com/ 官网下载并安装doker desktop 2. 配置镜像 &#xff08;1&#xff09;首先去阿里云网站上进行注册&#xff1a;https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors &#xff08;2&#xff09;注册完成后搜索&#xff1a;容…

实际工作中通过python+go-cqhttp+selenium实现自动检测维护升级并发送QQ通知消息(程序内测)

说明&#xff1a;该篇博客是博主一字一码编写的&#xff0c;实属不易&#xff0c;请尊重原创&#xff0c;谢谢大家&#xff01; 首先&#xff0c;今年比较忙没有多余时间去实操创作分享文章给大家&#xff0c;那就给大家分享下博主在实际工作中的一点点内容吧&#xff0c;就当交…

算法题--动态规划(连续子数组的最大和、丑数、n个骰子的点数)

目录 动态规划 JS构建二维数组注意 题目 连续子数组的最大和 原题链接 解析 核心思想 答案 丑数 原题链接 解析 核心思想 答案 n个骰子的点数 原题链接 解析 核心思想 答案 动态规划 通常用于优化递归或求最大、最小值等问题。一般把结果存在一个数组中. 首…

机器视觉赛道持续火热,深眸科技坚持工业AI视觉切入更多应用领域

随着深度学习等算法的突破、算力的不断提升以及海量数据的持续积累&#xff0c;人工智能逐渐从学术界向工业界落地。而机器视觉作为人工智能领域中一个正在快速发展的分支&#xff0c;广泛应用于工业制造的识别、检测、测量、定位等场景&#xff0c;相较于人眼&#xff0c;在精…

线性代数(二) 矩阵及其运算

前言 行列式det(A) 其实表示的只是一个值 ∣ a b c d ∣ a d − b c \begin{vmatrix} a & b\\ c & d\end{vmatrix} ad -bc ​ac​bd​ ​ad−bc&#xff0c;其基本变化是基于这个值是不变。而矩阵表示的是一个数表。 定义 矩阵与线性变换的关系 即得 ( a 11 a 12…

Linux usb设备固定端口号

Linux usb设备固定端口号 一:/sys/bus/usb/devices/二:设备信息三:固定usb设备名方法 一:/sys/bus/usb/devices/ 信息显示如下 1-0:1.0 1&#xff1a;表示 1 号总线&#xff0c;或者说 1 号 Root Hub0&#xff1a;表示端口号1&#xff1a;表示配置号0&#xff1a;表示接口号命…

ASCP系列电气防火限流式保护器在养老院的应用-安科瑞黄安南

摘要&#xff1a;2020年&#xff0c;我国65岁及以上老年人口数量为1.91亿&#xff0c;老龄化率达到13.5%。总体来看&#xff0c;大部分省市的养老机构数量还较少。养老设施的建设与民生息息相关&#xff0c;养老院的电气安全也非常重要。如果发生电气火灾&#xff0c;对于行动不…