C++新手求助:如何实现两个char vector的相同与不同元素查找
解决两个char vector的共有与独有元素问题
先修正你代码里的几个核心问题:
- 你定义的
diff是vector<int>,但我们要处理char类型,需改成vector<char> - STL的
set_difference、set_intersection这类集合算法,要求输入容器必须是有序的,所以第一步要先对两个char vector排序 - 访问vector元素很简单,用下标
v[i]或者范围for循环for (char c : v)都可以
下面是完善后的完整代码,包含输入处理、类型转换、结果计算与输出的全流程:
#include <iostream> #include <string> #include <vector> #include <algorithm> #include <iterator> using namespace std; int main(){ string s1, s2; cin >> s1; cin >> s2; // 将string转换为char vector vector<char> v1(s1.begin(), s1.end()); vector<char> v2(s2.begin(), s2.end()); // 必须先排序,否则集合算法无法正常工作 sort(v1.begin(), v1.end()); sort(v2.begin(), v2.end()); // 存储结果的vector vector<char> common; // 共有元素 vector<char> only_in_v1; // v1独有的元素 vector<char> only_in_v2; // v2独有的元素 // 计算共有元素 set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), back_inserter(common)); // 计算v1独有的元素(在v1里但不在v2里) set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), back_inserter(only_in_v1)); // 计算v2独有的元素(在v2里但不在v1里) set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), back_inserter(only_in_v2)); // 输出结果 cout << "共有元素:"; for (char c : common) { cout << c << " "; } cout << endl; cout << "仅在第一个字符串中的元素:"; for (char c : only_in_v1) { cout << c << " "; } cout << endl; cout << "仅在第二个字符串中的元素:"; for (char c : only_in_v2) { cout << c << " "; } cout << endl; return 0; }
关键细节说明
- 排序的必要性:
set_difference和set_intersection基于有序范围设计,通过线性遍历比较元素,无序输入会导致结果错误。 back_inserter的作用:自动将算法结果插入到vector末尾,无需提前分配容器大小,适合新手使用。- 元素访问方式:代码用了C++11的范围for循环,简洁直观;也可以用传统下标循环:
for (int i = 0; i < common.size(); i++) { cout << common[i] << " "; } - 重复元素处理:如果原字符串有重复字符,算法会保留对应次数的共有元素。若需要去重,可在排序后添加以下步骤:
// 排序后去重 sort(v1.begin(), v1.end()); v1.erase(unique(v1.begin(), v1.end()), v1.end()); sort(v2.begin(), v2.end()); v2.erase(unique(v2.begin(), v2.end()), v2.end());
内容的提问来源于stack exchange,提问作者Franco Lopez
相关产品推荐
相关产品推荐

