7-5.集合A-B

问题

求两个集合的差集。注意,同一个集合中不能有两个相同的元素。请用STL模板求解。

输入格式:

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据输入1行,每行数据的开始是2个整数n(0 < n ≤ 100)和m(0 < m ≤ 100),分别表示集合A和集合B的元素个数,然后紧跟着n+m个元素,前面n个元素属于集合A,其余的属于集合B。每两个元素之间以一个空格分隔。

输出格式:

针对每组测试数据输出一行数据,表示集合A-B的结果,如果结果为空集合,则输出“NULL”(引号不必输出),否则从小到大输出结果,每两个元素之间以一个空格分隔。

输入样例:

2

3 3 1 3 2 1 4 7

3 7 2 5 8 2 3 4 5 6 7 8

输出样例:

2 3

NULL

分析:

反思:

题目很简单,但是我调试了好久,最主要的错误是对于容器嵌套容器总是直接对内嵌容器执行push_back(),乍一看好像没有问题,但是却忽略了内存分配问题

我们定义外层容器时会直接给外层容器名分配内存空间,但是对于内嵌容器而言并未分配内存空间,因此我们是不可以直接对内嵌容器进行操作的!

解决:

定义一个内嵌容器类型的temp变量,temp是被分配了内存空间的,所以可以直接使用temp来执行需要的push_back()之类的操作, 执行完一次循环使用外层容器执行一次push_back(temp)并对temp执行clear()

例如:下列代码第18行,我最开始写的是num[i].push_back(a),却直接导致程序崩溃,问过openai才明白是内存分配的问题,内嵌容器此时尚未分配内存,直接插入数据是不被允许的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;

int main()
{
int T, temp, flag = 0, a, b;
vector<vector<int>> num;
vector<vector<int>> res;
vector<int> temp_v;
cin >> T;
for (int i = 0; i < T; ++i)
{
temp_v.clear();
cin >> a >> b;
temp_v.push_back(a);
temp_v.push_back(b);
for (int j = 0; j < a; ++j)
{
cin >> temp;
temp_v.push_back(temp);
}
for (int j = 0; j < b; ++j)
{
cin >> temp;
temp_v.push_back(temp);
}
num.push_back(temp_v);
}

for (int i = 0; i < T; ++i)
{
temp_v.clear();
a = 2;
b = 2 + num[i][0];
for (int j = 0; j < num[i][0]; ++j)
{
flag = 0;
for (int k = 0; k < num[i][1]; ++k)
{
if (num[i][a + j] == num[i][b + k])
{
flag = 1;
break;
}
}
if (!flag)
{
if (!count(temp_v.begin(), temp_v.end(), num[i][a + j]))
{
temp_v.push_back(num[i][a + j]);
}
}
}
res.push_back(temp_v);
}

for (auto i : res)
{
sort(i.begin(), i.end());
if (i.size())
{
copy(i.begin(), i.end(), ostream_iterator<int>(cout, " "));
cout << endl;
}
else
cout << "NULL" << endl;
}

return 0;
}