在两个字符向量之间显示相同和不同的元素



我是C++编程的新手。我想制作一个代码,显示两个char vectors有共同点和没有共同点的元素。

我首先通过cin创建两个string,然后将它们传递给向量。但现在我不知道如何比较两个vectorchar元素,甚至不知道如何获得这些元素。我试着把它们当作int,并使用set_difference,但都不起作用。

我很乐意听到任何关于如何完成我的代码的建议。

以下是我的代码中实际可以运行的部分:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;

int main(){

string s1, s2;
vector<int> diff;
cin >> s1;
cin >> s2;

vector<char> v1(s1.begin(), s1.end());
vector<char> v2(s2.begin(), s2.end());

return 0;
}

首先,您不必创建向量,也可以处理字符串。此外,包含不同字符的矢量应包含chars,而不是ints,因此:

int main(){
string s1, s2;
vector<char> diff;
vector<char> same;
cin>>s1;
cin>>s2;
...

现在,如果您想检查s1中的字符是否与s2不同或相同,则必须将s1中的每个元素与s2中的每个元件进行比较。

for(const auto& it : s1) { // for each element in s1
bool different = true; 
for(const auto& jt : s2) { // for each element in s2
if(it == jt) {
different = false; // if the elements are same, note it
break; // and break out of the loop
}
}
if(different) { // if this character wasn't same as any in s2, add it to the diff vector
diff.push_back(it);
} else {
same.push_back(it);
}
}

此时,diff包含s1s2不包含的所有元素,而same包含公共元素。您还需要附加s1不包含的s2元素。

for(const auto& it : s2) {
bool different = true;
for(const auto& jt : s1) {
if(it == jt) {
different = false;
break;
}
}
if(different) {
diff.push_back(it);
}
}

这个代码片段与上一个非常相似——唯一的区别是s2现在是外循环,s1是内循环,相同的元素不会添加到same向量中,因为它们已经添加到那里了。

您可能不熟悉for(const auto& it : s1)语法。在这里,它基本上等同于for(size_t it; it < s1.size(); ++it)(但它们在一般情况下有很大不同(。要了解更多详细信息,请访问谷歌";基于范围的循环";。

正如您所看到的,比较两个未排序的数组(在本例中为std::strings,这是隐藏的字符数组(是非常低效的。对于这种情况,一个更好的容器是std::set。它也有缺点,例如元素不能重复(如果你试图插入一个已经存在的元素,什么都不会发生(,但它非常适合这种情况。谷歌std::设置为有意识地使用它
最终代码:

#include <set>
#include <iterator> // to use std::make_move_iterator
#include <string>
#include <iostream>
using namespace std;
int main() {
string temp1, temp2; // create temporary strings, because you can't insert data directly to set with cin
cin >> temp1;
cin >> temp2;
// move data from temporary strings to sets
set<char> s1(make_move_iterator(temp1.begin()), make_move_iterator(temp1.end()));
set<char> s2(make_move_iterator(temp2.begin()), make_move_iterator(temp2.end()));
set<char> diff; // it also can be a set

for(const auto& it : s1) {
if(s2.count(it) == 0) { // if the element of s1 is not present in s2, insert it to diff
diff.insert(it);
} else { // if it is present, insert it to same
same.insert(it);
}
}
for(const auto& it : s2) {
if(s1.count(it) == 0) {
diff.insert(it);
}
}
for(const auto& it : diff) {
cout << it;
}
cout << "n"
for(const auto& it : same) {
cout << it;
}
}

最新更新