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; }
|