2013-02-12 40 views
0

我有一个函数接受两个向量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); 
} 

回答

5

一种选择是将两个矢量进行排序,然后用std::set_intersection

+0

我会说这是不是只是一个* *的选择,但通常较好的选择。 – 2013-02-12 22:50:41

1

那么,你的inter功能有几个问题:

  • 返回类型是一个单一的元素
  • 两个未使用的局部变量
  • 只测试对一个每个元素在同一位置的其他集
0

对于交互函数,首先将返回类型更改为一个向量,然后使用当前未用于下面操作的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}

+0

当我返回v3时,它会抛出错误。错误:无法将'v3'从'std :: vector >'转换为'std :: basic_string '| – user1721532 2013-02-12 23:04:16

+0

您的初始功能定义应如下所示: vector inter(...) 确保将v3定义为矢量,以便它正确地适合您的模板,因为错误看起来像您没有更改函数的返回类型。 – MCWhitaker 2013-02-12 23:11:01

+0

我编辑了我的原始答案,使其更加清晰。 – MCWhitaker 2013-02-12 23:16:59

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代码