我有一个接受两个向量v1和v2的函数。比较它们中的元素,并且应该从两者中返回公共元素。两个向量都有5个字符串。
但是,它没有按预期工作。例如,我输入v1:dog cat lizard snake pig
和v2有:
cat sheep cow snake fish
结果虽然是:
snake
如何修复它以使输出看起来像以下那样?
cat snake
我的代码
#include <iostream>
#include <vector>
#include <string>
using namespace std;
const int CAPACITY = 5;
template <typename t>
vector <t> inter(const vector <t> & v1, const vector <t> & v2)
{
vector <t> v3;
for(int i = 0; v1.size(); i++ )
{
for(int j= 0; v2.size(); j++)
{
if (v1[i] == v2[j])
{
v3.push_back(v1[i]);
}
}
}
return v3;
}
int main()
{
vector<string> vec1;
string a;
cout << "Enter five stings for vector 1 \n"<< endl;
for(int i = 0; i< CAPACITY; i++ )
{
cin >> a;
vec1.push_back(a);
}
vector<string> vec2;
string b;
cout << "Enter five stings for vector 2 \n"<< endl;
for(int i = 0; i< CAPACITY; i++ )
{
cin >> b;
vec2.push_back(b);
}
cout<<inter(vec1, vec2);
}
答案 0 :(得分:5)
一种选择是对两个向量进行排序,然后使用std::set_intersection
。
答案 1 :(得分:2)
使用std::set_intersection算法要容易得多,它需要两个排序的向量:
template <typename T>
std::vector<T> inter(const std::vector<T> & v1, const std::vector<T> & v2)
{
std::vector<T> v3;
std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(v3));
return v3;
}
std::sort(vec1.begin(), vec1.end()); // sort vec1
std::sort(vec2.begin(), vec2.end()); // sort vec2
std::vector<std::string> v3 = inter(vec1, vec2);
请参阅sample代码
答案 2 :(得分:1)
嗯,你的inter
函数存在一些问题:
答案 3 :(得分:0)
对于inter函数,首先将返回类型更改为向量,然后使用当前未用于以下操作的v3向量。
vector<t> inter(const vector <t> & v1, const vector <t> & v2)
{
vector<t> v3;
for(int i=0; i<v1.size(); i++)
{
for(int j=0; j<v2.size(); j++)
{
if(v1[i] == v2[j])
{
v3.push_back(v1[i])
}
}
}
return v3;
}
要打印出你必须将返回的矢量分配给变量的内容,然后循环遍历它......
vector<t> vec3 = inter(vec1, vec2);
for(int i=0; i<vec3.size(); i++)
{
cout<<vec3.at(i)<<" ";
}
这将返回一个包含所有答案的向量,确保对循环进行更改,就像循环之前只检查它们是否在同一个地方一样,而不是它们都在向量中
请注意,在{x,x,y}和{x,z,a}
的情况下,这会产生重复的结果