我是C++编程的新手。我想制作一个代码,显示两个char vectors
有共同点和没有共同点的元素。
我首先通过cin
创建两个string
,然后将它们传递给向量。但现在我不知道如何比较两个vector
的char
元素,甚至不知道如何获得这些元素。我试着把它们当作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;
}
首先,您不必创建向量,也可以处理字符串。此外,包含不同字符的矢量应包含char
s,而不是int
s,因此:
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
包含s1
中s2
不包含的所有元素,而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::string
s,这是隐藏的字符数组(是非常低效的。对于这种情况,一个更好的容器是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;
}
}