奇妙的知识增加了(狗头.jpg )
又是一个vector的运用题,vector真的太好用了!!真爱一生推
反思:这个题又出现了内存超限的问题,但是具体问题不多,除了因为不细致没有考虑好的换行问题,重点是总结一下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<vector<int>> arr(n);//n个一维数组
for (int i = 0; i < n; i++)
{
arr[i].push_back(i+1);//把元素(i+1)存入arr[i]中,数组长度自动增长
}
arr[b].clear();//把b位置清空,但是clear只是清空了vector的元素,但是没有释放内存,导致内存超限的罪魁祸首!
vector<int> v;//把已经用完的vector释放掉
{
v.swap(arr[b]);
}
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来存。
看到一句话,很喜欢写在这里,共勉:
成功的人往往是犯错最多的人。