矢量差异,同时保留顺序

时间:2016-02-12 12:53:44

标签: c++ string c++11 vector set-difference

我有两个char向量说{'G', 'K', 'A', 'L', 'P'}{'K', 'P', 'T', 'M'}。我必须在保留顺序(即{'G', 'A', 'L'}

的同时获得这两个向量之间的差异

我知道std::set_difference函数,但无法使用,因为这需要对向量进行排序。有没有优化的方法在C ++中执行此操作?

2 个答案:

答案 0 :(得分:8)

您只能从第二个向量创建std::set以获得对数查找复杂度,然后遍历第一个向量,如果元素未找到则推送到结果向量设置:

#include <iostream>
#include <vector>
#include <set>
#include <iterator>
#include <algorithm>

int main()
{
    std::vector<char> a = {'G', 'K', 'A', 'L', 'P'};
    std::vector<char> b = {'K', 'P', 'T', 'M'};
    std::vector<char> result;

    std::set<char> s(b.begin(), b.end());

    std::copy_if(a.begin(), a.end(), std::back_inserter(result),
                 [&s](char elem) { return s.find(elem) == s.end(); });

    for(auto elem : result)
        std::cout << elem << ", ";

    return 0;
}

Live on Coliru

如果您想仅减去在第二个向量中找到的值的数量,请使用std::multiset重新设置此值,您还可以erase找到集合中的元素:

std::copy_if(a.begin(), a.end(), std::back_inserter(result), [&s](char elem)
{
    auto it = s.find(elem);

    if(it == s.end())
        return true;

    s.erase(it);
    return false;
});

请注意,上述内容将删除第一次出现并保留以后的内容。

std::copy_if(a.rbegin(), a.rend(), ...

会做相反的事情,但它也会给你反转输出。

答案 1 :(得分:0)

手动解决方案:

std::vector<char> a{'G','K','A','L','P'};
std::vector<char> b{'K','P','T','M'};
std::vector<char> result;

for(auto const& item:a){
   if(std::find(std::begin(b),end(b),item)==std::end(b)){
       result.push_back(item)
   }
}