蓝桥杯-常用STL(一)

常用STL

🎈1.动态数组

🔎有些时候想开一个数组,但是却不知道要开多大长度的数组合适,因此我们需要用到的数组可能会根据情况变动。这时候我们就需要用到动态数组。所谓动态数组,也就是不定长数组,数组的长度是可以根据我们的需要动态改变的。动态数组的实现也不难,但是C++里面有已经写好的标准模板库(Standard Template Library),也就是我们常说的STL库,实现了集合、映射表、栈、队列等数据结构和排序、查找等算法。我们可以很方便的调用标准库来减少我们的代码量。C++中动态数组写作vector

🎈2.vector的基础使用

🔭2.1引入库

引入库: C++vector的实现是在一个<vector>头文件中,在代码的开头引入这个头文件,并在引入所有头文件之后加上一句using namespace std;

cpp 复制代码
#include <vector>
using namespace std;
int main()
{
	return 0;
}

🔭2.2构造一个动态数组

构造一个动态数组: C++中直接构造出一个vector的语句为:vector<T>vec.这样我们定义了一个名为vec的储存T类型数据的动态数组。其中T是我们数组要储存的数据类型,可以是int、float、double、或其他自定义的数据类型等等。初始的时候vec是空的。比如vector<int>a定义了一个储存整数的动态数组a.

🔭2.3插入元素

C++中通过push_back()方法在数组最后面插入一个新的元素。

cpp 复制代码
#include <vector>
using namespace std;
int main()
{
	vector<int> vec;//[]
	vec.push_back(1);//[1]
	vec.push_back(2);//[1,2]
	vec.push_back(3);//[1,2,3]
	return 0;
}

🔭2.4获取长度并且访问元素

C++中通过size()方法获取vector的长度,通过[]操作直接访问vector中的元素,这一点和数组是一样的。

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;
int main()
{
	vector<int> vec;//[]
	vec.push_back(1);//[1]
	vec.push_back(2);//[1,2]
	vec.push_back(3);//[1,2,3]
	for (int i = 0; i < vec.size(); i++)
	{
		cout << vec[i] << endl;
	}
	return 0;
}

🔭2.5修改元素

C++中修改vector中的某个元素很简单,只需要用=给它赋值就好了。

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;
int main()
{
	vector<int> vec;//[]
	vec.push_back(1);//[1]
	vec.push_back(2);//[1,2]
	vec.push_back(3);//[1,2,3]
	vec[1] = 3;//[1,3,3]
	vec[2] = 2;//[1,3,2]
	for (int i = 0; i < vec.size(); i++)
	{
		cout << vec[i] << endl;
	}
	return 0;
}

🔭2.6删除元素

和插入一样,删除元素也只能在动态数组的末端进行操作。C++中通过pop_back()方法删除动态数组的最后一个元素。

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;
int main()
{
	vector<int> vec;//[]
	vec.push_back(1);//[1]
	vec.push_back(2);//[1,2]
	vec.push_back(3);//[1,2,3]
	vec.pop_back();//[1,2]
	vec.pop_back();//[1]
	return 0;
}

🔭2.7清空

C++中只需要调用clear()方法就可以清空vector
C++vectorclear()只是清空vector,并不会清空开的内存。用一种方法可以清空vector的内存:vector<int>().swap(v);

🎈3.vector的基础应用

🔭3.1例题一

🔎题目 :将1-10的平方依次存储到刚才定义的vector里面。这里我们需要借助一个循环来完成,循环枚举1到10,并且将这些值输出。

🏆算法

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;
int main()
{
	vector<int> v;
	for (int i = 1; i <= 10; i++)
	{
		v.push_back(i * i);
	}
	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
	return 0;
}

🎈4.用动态数组存储自定义数据

✅动态数组不仅仅可以储存基本的数据类型,还能储存自定义数据类型,比如结构体。

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;
struct Student
{
	string name;
	int age;
};
int main()
{
	vector<Student> class1;
	Student stu1, stu2;
	stu1.name = "ZHANGSAN";
	stu1.age = 18; 
	stu2.name = "LISI";
	stu2.age = 19;
	class1.push_back(stu1);
	class1.push_back(stu2);
	return 0;
}

🔭通过上面的学习,我们知道可以通过push_back()来向动态数组添加一个元素。如果我们需要一个长度为n的,全是1的动态数组。我们可以像下面这样写:

cpp 复制代码
int n = 10;
vector<int> vec;
for (int i = 0; i < n; i++)
{
	vec.push_back(1);
}

✅其实,我们可以通过一个构造函数快速构建这样的一个动态数组。所谓构造函数,就是在我们定义一个对象的时候,可以赋予初始值。

cpp 复制代码
int n = 10;
vector<int> vec(n,1);

上面的代码,我们定义了一个vector的时候,调用构造函数,第一个参数表示初识的动态数组的长度,第二个参数表示初识数组里面每个元素的值。如果不传入第二个参数,那么初始值都是0
:上面用的构造函数的写法和用循环是等价的,通过合理的使用构造函数,可以减少代码量。

🔭4.1二维的动态数组

✅我们都知道,数组可以开二维的,那么动态数组能用二维的吗?答案是肯定的,动态数组也支持二维的。vector<vector<int> >vec2,这样就定义了一个二维的动态数组。注意: <int> >中间有一个空格,这个空格一定要加上,否则在一些老版的编译器上将不能通过编译。

🔎通过上面的方法定义的二维数组,每一维都是空的,我们必须要一维一维的赋值。比如我们规定第一维的大小是n

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;
int main()
{
	int n = 5;
	vector<vector<int> >vec2;
	for (int i = 0; i < n; i++)
	{
		vector<int> x(i + 1, 1);
		vec2.push_back(x);
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < vec2[i].size(); j++)
		{
			cout << vec2[i][j] << " ";
		}
		cout << endl;
	}
	cout << endl;
	return 0;
}

✅二维动态数组的每一维的长度都可以不一样,可以是任意形状的,借助构造函,我们可以快速构造一个n行m列的动态数组,每个元素的初始值是0vector<vector<int> >vec2(n,vector<int>(m,0))

🏆这里我们尝试定义一个二维的储存整数的动态数组v2d,接下来我们给第一维赋值,第一维的大小为5,每个元素是一个一维的vector。我们这里通过vector<int>()快速构造一个一维的vector。试写出11=1~55=25的乘法表。

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;
int main()
{
	vector<vector<int> >v2d;
	for (int i = 0; i < 5; i++)
	{
		v2d.push_back(vector<int>());
	}
	for (int i = 0; i < v2d.size(); i++)
	{
		for (int j = 0; j <= i; j++)
		{
			v2d[i].push_back((i + 1) * (j + 1));
		}
	}
	for (int i = 0; i < v2d.size(); i++)
	{
		for (int j = 0; j < v2d[i].size(); j++)
		{
			cout << i + 1 << " * " << j + 1 << " = " << v2d[i][j] << "\t";
		}
		cout << endl;
	}
	return 0;
}
相关推荐
weixin_4786897611 分钟前
【回溯法】——组合总数
数据结构·python·算法
戊子仲秋29 分钟前
【LeetCode】每日一题 2024_11_14 统计好节点的数目(图/树的 DFS)
算法·leetcode·深度优先
TaoYuan__2 小时前
机器学习的常用算法
人工智能·算法·机器学习
好心的小明2 小时前
【蓝桥杯】CB组国二攻略(省赛地点:广东)
职场和发展·蓝桥杯
槿花Hibiscus2 小时前
C++基础:Pimpl设计模式的实现
c++·设计模式
用户40547878374823 小时前
深度学习笔记 - 使用YOLOv5中的c3模块进行天气识别
算法
十七算法实验室3 小时前
Matlab实现麻雀优化算法优化随机森林算法模型 (SSA-RF)(附源码)
算法·决策树·随机森林·机器学习·支持向量机·matlab·启发式算法
ღ 金龍戲水 ღ3 小时前
蓝桥杯竞赛单片机组备赛【经验帖】
经验分享·单片机·蓝桥杯
黑不拉几的小白兔3 小时前
PTA部分题目C++重练
开发语言·c++·算法
迷迭所归处3 小时前
动态规划 —— dp 问题-买卖股票的最佳时机IV
算法·动态规划