首页 > 编程语言 >[详解-vector] C++必知必会 vector常用各种操作解析

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

时间:2024-03-03 22:55:30浏览次数:23  
标签:myVector cout 必知 300 ++ C++ int vector

原文转载自知乎:https://zhuanlan.zhihu.com/p/648650828
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 0
	for (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 10
	for (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 3
	for (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 0
	for (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 5
	for (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 5
	for (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 3
	vector<int> vector1(arr, arr + 3);
	for (int i = 0; i < vector1.size(); i++)
		cout << vector1[i] << " ";   
	cout << endl;
	//输出内容是:2 3
	vector<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[i].resize(5);
	}
       
        // 输出的是一片空格 
	for (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.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个1
	for (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 4
	1 2 3 4
	1 2 3 4
	1 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 4
	5 6 7 8
	9 10 11 12
	13 14 15 16*/

5. 访问 vector 中的元素:

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

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

6.获取 vector 的大小:

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

	vector<int> myVector = { 100,200,300,400, 500 };
	cout << myVector.size() << endl; // 5
	cout << 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 300
	for (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 600
	for (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 600
	for (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 999
	for (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 300
	for (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 600
	for (int i = 0; i < myVector.size(); i++) {
		cout << myVector[i] << " ";
	}
	cout << endl;

	it = myVector.begin() + 2; //索引为2的位置
	myVector.erase(it); //删除索引为2的位置的元素
	//输出内容为:200 300 500 600
	for (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 600
	for (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()); //删除数值为555的元素
	myVector.erase(remove(myVector.begin(), myVector.end(), 333), myVector.end()); //删除数值为333的元素
	//输出内容为:100 200 300 400 500 600
	for (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 500
	for (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);
	//输出内容为:目标元素的索引为: 4
	if (it != myVector.end()) {
		cout << "目标元素的索引为: " << distance(myVector.begin(), it) <<endl;
	}
	else {
		cout << "没有找到" <<endl;
	}

②使用迭代器遍历查找:

	vector<int> myVector = { 100,200,300,400,500,600 };
	bool found = false;
	int valueToFind = 300;

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

14.清空 vector 中的元素:

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

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

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

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

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

17.使用foreach循环遍历 vector:

①第一种通过foreach循环遍历的方法

在这个例子中,使用的是范围-based for 循环(也称为foreach循环),其中 int it 是一个迭代变量,而不是传统的迭代器。这种循环方式是C++11引入的一种简化语法,用于遍历容器中的元素。

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

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

②第二种通过foreach循环遍历的方法(推荐)

这种遍历方式使用了C++11引入的范围-based for 循环,也称为foreach循环。在这种循环中,auto it 是一个自动类型推断的语法,it 并不是一个传统意义上的迭代器,而是直接取得 myVector 中的每个元素的值

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

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

标签:myVector,cout,必知,300,++,C++,int,vector
From: https://www.cnblogs.com/hazy-star/p/18050925

相关文章

  • C++ 字符串(string)常用操作总结
    转载自知乎回答:https://zhuanlan.zhihu.com/p/553061732由单引号括起来的一个字符被称作char型字面值,双引号括起来的零个或多个字符则构成字符串型字面值。字符串字面值的类型实际上就是由常量字符构成的数组,,编译器在每一个字符串后面添加一个空字符('\0'),因此字符串的实际长度要......
  • C++基本知识梳理
    一.命名空间概念:命名空间是新定义的一个作用域,里面可以放函数,变量,定义类等,主要用来防止命名冲突.实现:namespace关键字命名空间名字{命名空间成员}注意点:1.命名空间可以嵌套使用,还可以使用inline关键字实现版本控制(inline修饰的命名空间默认展开到外一层命名空......
  • C++ 接口(抽象类) 虚函数
    接口描述了类的行为和功能,而不需要完成类的特定实现。C++接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。纯虚函数是通过在声明中使用"=0"来指定的clas......
  • C++网上购书系统项目的二次开发
    1.来源该项目来自同学以前的期末大作业:网上购书系统项目。2.运行环境及运行结果(1)运行环境:DevC++(2)运行结果:代码如下:点击查看代码#include<iostream>#include<string>#include<fstream>#include<vector>#include"buyer.h"#include"book.h"#include"order.h&q......
  • c++复习笔记——STL(vector)
    c++-----STL容器系列(1)vector1介绍Vector是stl容器中一种常见的容器,基本和数组类似,其大小(size)可变,常用于数组长度不确定时来代替数组,当数据超过vector预定值时vector将自动扩容。Vector是一种顺序存储器,在内存中连续排列,可以通过下标访问,时间复杂度为O(1)。2创建和使用使用......
  • C++ 函数调用运算符 () 重载
    函数调用运算符()可以被重载用于类的对象。当重载()时,您不是创造了一种新的调用函数的方式,相反地,这是创建一个可以传递任意数目参数的运算符函数。1#include<iostream>2usingnamespacestd;3classDistance4{5private:6intfeet;/......
  • C++ 赋值运算符'='重载
    C++拷贝构造函数(初学有点难理解)就像其他运算符一样,可以重载赋值运算符(=),用于创建一个对象,比如拷贝构造函数。1#include<iostream>2usingnamespacestd;3classDistance4{5private:6intfeet;//0到无穷7intinches;......
  • C++ ++ 和 -- 运算符重载
    原文递增运算符(++)和递减运算符(--)是C++语言中两个重要的一元运算符。1、递增和递减一般是改变对象的状态,所以一般是重载为成员函数。2、重载递增递减,一定要和指针的递增递减区分开。因为这里的重载操作的是对象,而不是指针(由于指针是内置类型,指针的递增递减是无法重载的),......
  • C++中UNIX时间戳与日期互转
    C++中UNIX时间戳与日期互转使用time.h头文件localtime可以把时间戳转为tm结构体,tm结构体中可以格式化输出时间mktime可以把tm结构体转为时间戳tm结构体中:year需要+1900,tm_mon的范围是0-11,tm_mday的范围是1-31structtm{inttm_sec;//secondsaftert......
  • pytorch报错:Variable._execution_engine.run_backward( # Calls into the C++ engine
    GPU模式下运行pytorch代码报错,pytorch为2.2.1,NVIDIA驱动版本535.161.07File"/home/devil/anaconda3/envs/sample-factory/lib/python3.11/site-packages/torch/_tensor.py",line522,inbackwardtorch.autograd.backward(File"/home/devil/anaconda3/envs/sample-......