我的向量交集函数有什么问题?

What's wrong with my vector-intersection function?

本文关键字:什么 问题 集函数 向量 我的      更新时间:2023-10-16

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

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

使用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);

请参阅示例代码

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

  • 返回类型是单个元素
  • 两个未使用的局部变量
  • 只针对另一组中相同位置的元素测试每个元素

对于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}

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