STL 之 vector 通俗理解

发布时间:2023年12月28日

?注:如果只想学使用,直接看第二大点

一、创建

容器之一:vector

单词 vector? 意思是“向量,矢量,载体……”? 你可以读成 “微可脱尔”,哈哈哈

?其实就是个动态数组,通俗的讲就是个高级一点的数组而已,一般的普通数组一旦建立了后其大小就不可以再改变了,但是这个高级的数组vector就高级在建立了以后其大小依然还是可改变的,想多大就多大,大到内存爆炸,想多小就多小,小到为0,这就是它的牛掰之处了,所以它有一个超级厉害的特点:在它的尾巴处添加或者删除的时间复杂度为O(1),只需要记住在尾巴处插入或者删除很快就行,至于怎么个快法,你就当比走路快一点点就行了(涉及其他知识,学完其他容器就知道了)

一句话就是:vector 是数组的高级版,大小随“心”所欲,尾巴处增删比较方便。完事

?接下来看它的所有操作:

使用前记得先添加头文件:

#include <vector>

一、创建:

① vector< Type?> name ;? ? ? ? ? 就是:? vector <数据类型> ?你想取的名字? ;

vector < int > myVector = { 1,2,3,4,5 }; //和数组一样的功能

③ 当变量用,直接用 “=” 给它赋值

	vector < int > aa = { 1,2,3 };
    int bb[5] = {1,2,3,4,5} 

	vector < int > myVector = aa; //直接把一个高级数组 aa 当一个具体数值用
    vector < int > myVector = bb; //直接无视 bb 的大小,只要它是 int 类型就行

④当函数用,

//注意参数类型 和参数个数

vector < int > myVector(n); //参数为一个正整数,创建一个大小为n的高级数组,默认为0

vector < int > myVector(n,num); //参数为一个正整数和数值, 创建一个大小为n、默认为num的高级数组

vector < int > myVector(testVector);  //创建一个完全等于testVector 的新高级数组

vector < int > myVector (*p, *q);  // 理解为把 起始地址为 *p ,结束地址为 *q-1 的一段数据复制给新数组myVector

注意:!!!!!!!!!!!!!!!!!!!!!!!!!

vector < int > aa = { 1,2,3 };

vector < int > myVector = aa;? ?等于? vector < int > myVector( aa );

⑤二维动态数组,也就是 vector< Type?> name 里的类型?Type? 也为 vector 类型 ,即就是

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

…………

够用了

…………

二、使用

①访问:

可以使用下标操作符?[]?来访问,还可以使用? .at(index)来访问, 还可以使用迭代器 vector<int> :: iterator it? 来访问

	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

或者
	cout << myVector.at(0) << endl; // 100 
	cout << myVector.at(1) << endl; // 200
	cout << myVector.at(2) <<endl;  // 300
	cout << myVector.at(3) << endl; // 400
或者
vector<int> :: iterator it=aa.begin();
	cout << *it   << endl; // 100 
	cout << *it+1 << endl; // 200
	cout << *it+2 <<endl;  // 300
	cout << *it+3 << endl; // 400

②增删改查

增加:?push_back() 和??insert()? 和 emplace() ,后两个是属于迭代器的函数,STL里面的很多容器都可以使用,而且一般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;

删除:

同样有?pop_back()? 和??erase()? 和? remove() ,后两个同理,可以用,但不合适

使用?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;

修改:

使用下标操作符 [] 来修改、 使用 .at(index)来修改 、还可使用迭代器 *it = 来修改

	vector<int> myVector = { 100,200,300,400,500 };
	myVector[0] = 111; // 修改索引为0的元素
	myVector[1] = 222; // 修改索引为1的元素
	//输出内容是:111 222 300 400 500


	myVector.at(0) = 333; // 修改索引为0的元素
	myVector.at(1) = 444; // 修改索引为1的元素
	//输出内容是:333 444 300 400 500


     vector<int>::iterator it = myVector.begin();
	*it = 555; 
	*(it+1) = 666; 
	//输出内容是:555 666 300 400 500

查找:

使用?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;
	}

清空 vector 中的元素:

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

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

使用索引遍历 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;

使用迭代器遍历 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;

使用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;

文章来源:https://blog.csdn.net/QENGFENG/article/details/135275631
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。