您可以从第二个向量中创建一个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;
}
如果你想要“仅减去第二个向量中找到的值的数量”,请使用
std::multiset
重新制作,并在其中使用
erase
删除找到的元素:
在Coliru上查看实时效果
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(), ...
反转函数会使输出结果倒置,但它同时也会给你一个反转后的输出。
{A, B, C, A, B, C}
和{B, A}
的结果会是什么? - Jarod42