计蒜客 | 堆积木题解和相关知识点 | 数组vector小结

奇妙的知识增加了(狗头.jpg
又是一个vector的运用题,vector真的太好用了!!真爱一生推
反思:这个题又出现了内存超限的问题,但是具体问题不多,除了因为不细致没有考虑好的换行问题,重点是总结一下vector的用法。

  • 题目描述
    计蒜客 | 堆积木题解和相关知识点 | 数组vector小结_第1张图片
    大体解题思路还是比较简单的。大致为申请一个vector二维数组,然后初始化,把积木初始的状态摆好,然后就进行移位、清零。具体内容直接看代码吧~
  • 代码部分
#include<iostream>
#include<vector>//跟上一个例子一样,用vector的必备头文件
using namespace std;
int main()
{
	int n, m;//n块积木,m次操作
	int a, b;//b上的木头给a
	cin >> n >> m;
	vector<vector<int>> arr(n);//每一个位置的积木,二维数组初始化
	for (int i = 0; i < n; i++)
	{
		arr[i].push_back(i+1);//每个位置初始化为i,当前积木的编号
	}
	while (m--)
	{
		cin >> a >> b;
		a--, b--;//因为我习惯从0开始存,所以先减了一下
		if (a == b)
			continue;
		else
		{
			if (arr[b].size() == 0)//剪枝判断,b中没有元素了,则没必要继续了
				continue;
			for (int i = 0; i <arr[b].size(); i++)
			{
				arr[a].push_back(arr[b][i]);//把b的元素整体移到a上面
			}
			arr[b].clear();//把b位置清空,但是clear只是清空了vector的元素,但是没有释放内存,导致内存超限的罪魁祸首!
			vector<int> v;//把已经用完的vector释放掉
			{
				v.swap(arr[b]);
			}
		}
	}
	for (int i = 0; i < n; i++)//打印当前的积木堆
	{
		if (arr[i].size() == 0)//当前位置没有数
			cout << endl;
		else//当前位置有数		
		{
			for (int j = 0; j <int(arr[i].size()); j++)
				cout << arr[i][j] << " ";
			cout << endl;//刚开始忘了写这个= =,结果格式错了
		}
	}
	return 0;
}

vector相关用法小结

  1. 内存预分配
    可以用输入的变量进行预分配,很方便在输入数据个数不明确的时候申请数组。而且可以预分配二维数组的一维数组个数,然后每个一维数组就直接一边输入一边pushback就好了。
    例子,
	vector<vector<int>> arr(n);//n个一维数组
	for (int i = 0; i < n; i++)
	{
		arr[i].push_back(i+1);//把元素(i+1)存入arr[i]中,数组长度自动增长
	}
  1. 内存释放
    clear():删除vector中所有的元素,把vector的size变成0,但是内存没有释放掉。
    swap(vector[i]):把vector中的元素全部删掉,并且释放内存(emmm, 好像释放了内存也没地儿存元素了哈。。。)
    例子,
	arr[b].clear();//把b位置清空,但是clear只是清空了vector的元素,但是没有释放内存,导致内存超限的罪魁祸首!
	vector<int> v;//把已经用完的vector释放掉
	{
		v.swap(arr[b]);
	}
  1. vector数组中的元素
    size():返回当前vector的元素个数
    pushback(data):把输入的元素存入vector数组当中
    例子,
	if (arr[b].size() == 0)
		continue;
	for (int i = 0; i <arr[b].size(); i++)
	{
		arr[a].push_back(arr[b][i]);//把b的元素整体移到a上面
	}

一个误区

	vector<int> a;
	for(int i=0;i<10;i++)
	    a[i]=i;

这样做不能把元素存进去,要用pushback来存。

  1. 在搜索中找到了一个总结好厉害的,可以看看这个(❤ ω ❤)
    vector用法整理(详细)
    大概先这些,以后追更吧~

看到一句话,很喜欢写在这里,共勉:
成功的人往往是犯错最多的人。

你可能感兴趣的:(计蒜客题解,数据结构,c++)