C++ 如何在两个大小不同的向量中找到公共数

C++ 如何在两个大小不同的向量中找到公共数,c++,stl,C++,Stl,我有两个大小不同的整数向量: 向量1={1,1,3,3,5,5,8,8,8} 向量2={1,3,3,5,8} 我试图循环遍历这两个向量,比较它们的值,看看它们是否相似,然后将它们添加到一个新的向量中 以下是我尝试过的: vector<int> firstList{1, 1, 3, 3, 3, 5, 5, 8, 8, 8} vector<int> secondList{1, 3, 3, 5, 8} vector<int> finalList; for

我有两个大小不同的整数向量:

向量1={1,1,3,3,5,5,8,8,8}

向量2={1,3,3,5,8}

我试图循环遍历这两个向量,比较它们的值,看看它们是否相似,然后将它们添加到一个新的向量中

以下是我尝试过的:

vector<int> firstList{1, 1, 3, 3, 3, 5, 5, 8, 8, 8}
vector<int> secondList{1, 3, 3, 5, 8}
vector<int> finalList;

    for (std::vector<char>::iterator i = firstList.begin(); i != firstList.end(); ++i)
    {
        if (std::find(secondList.begin(), secondList.end(), *i) != secondList.end())
        {
            finalList.push_back(*i);
        }
    }
vector firstList{1,1,3,3,3,5,5,8,8}
向量二次列表{1,3,3,5,8}
向量终结者;
对于(std::vector::iterator i=firstList.begin();i!=firstList.end();++i)
{
if(std::find(secondList.begin(),secondList.end(),*i)!=secondList.end())
{
终结者。推回(*i);
}
}
我期望finalList中的输出是:{1,3,3,5,8}

实际输出是:{1,1,3,3,5,5,8,8,8}当我只需要5时,它返回10个值


谢谢你的帮助

复制最小的列表,然后删除该列表中找到的项,以便在下一个循环中排除找到的项

vector<int> firstList{1, 1, 3, 3, 3, 5, 5, 8, 8, 8}
vector<int> secondList{1, 3, 3, 5, 8}
vector<int> finalList;

vector<int> secondListCopy = secondList;

for (std::vector<int>::iterator i = firstList.begin(); i != firstList.end(); ++i)
{
    std::vector<int>::iterator i2 = std::find(secondListCopy.begin(), secondListCopy.end(), *i) ;
    if (i2 != secondListCopy.end())
    {
        finalList.push_back(*i);
        secondListCopy.erase(i2);

        if(secondListCopy.empty()) break; //just additional optimization.
    }
}
vector firstList{1,1,3,3,3,5,5,8,8}
向量二次列表{1,3,3,5,8}
向量终结者;
向量secondListCopy=secondList;
对于(std::vector::iterator i=firstList.begin();i!=firstList.end();++i)
{
std::vector::iterator i2=std::find(secondListCopy.begin(),secondListCopy.end(),*i);
if(i2!=secondListCopy.end())
{
终结者。推回(*i);
第二个列表复制。擦除(i2);
if(secondListCopy.empty())break;//只是额外的优化。
}
}

您可以使用
设置
。使用最大向量初始化集合

using namespace std;

int main()
{
vector<int> firstList{1, 1, 3, 3, 3, 5, 5, 8, 8, 8};
vector<int> secondList{1, 3, 3, 5, 8};
vector<int> finalList;

set<int> firstSet{firstList.begin(),firstList.end()};
for(auto& i : secondList)
    if(*firstSet.find(i)) //find i in firstSet/firstList
       finalList.push_back(i);


for(auto& i : finalList)
   cout << i << " ";  //Output: 1 3 3 5 8 

}
使用名称空间std;
int main()
{
向量第一列表{1,1,3,3,5,5,8,8,8};
向量二次列表{1,3,3,5,8};
向量终结者;
set firstSet{firstList.begin(),firstList.end()};
用于(自动和输入:第二个列表)
if(*firstSet.find(i))//在firstSet/firstList中查找i
终结者。推回(i);
用于(自动和i:finalList)

cout在O(NlogN)中执行此操作的最佳方法是对两个向量进行排序并同时循环两个向量

sort(firstList.begin(),firstList.end());
sort(secondList.begin(),secondList.end());
int i = 0, j = 0;
while (i < firstList.size() && j < secondList.size())
{
    if (firstList[i] == secondList[j])
    {
        finalList.push_back(firstList[i]);
        i++;j++;
    }
    else if (firstList[i] < secondList[j])
    {
        i++;
    }
    else
    {
        j++;
    }
}
排序(firstList.begin(),firstList.end()); 排序(secondList.begin(),secondList.end()); int i=0,j=0; 而(i
是什么阻止您将当前输出保存在新向量中,然后作为附加步骤从该向量中删除所有重复值?请注意,整个方法确实是错误的,有更好的方法可以做到这一点:1)从两个数组中删除所有重复值,2)组合两个数组并对组合的数组排序3)查找所有重复值在新数组中输入数字,任务完成。使用矢量代替矢量。您可以将第二个数组放入第一个循环,反之亦然,然后在push_back()后添加一个中断;它将为您提供所需的结果,但它不是问题的正确答案,因为它在所有情况下都不起作用。当您在第二个列表中找到某个项目时,请删除第二个列表中的该项目,以便将其排除在find()中。