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