我的矢量交叉函数有什么问题?

时间:2013-02-12 22:43:18

标签: c++

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

4 个答案:

答案 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}

的情况下,这会产生重复的结果