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);
}
4

4 回答 4

5

一种选择是对两个向量进行排序,然后使用std::set_intersection.

于 2013-02-12T22:45:26.483 回答
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);

查看示例代码

于 2013-02-12T22:54:24.490 回答
1

好吧,你的inter函数有几个问题:

  • 返回类型是单个元素
  • 两个未使用的局部变量
  • 仅针对另一组中相同位置的元素测试每个元素
于 2013-02-12T22:45:32.913 回答
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} 的情况下产生重复的结果

于 2013-02-12T22:49:26.357 回答