使用算法和lambda计算和检索重复



我有一个像这样的结构向量:

struct Item {
int id;
string name;   
}
vector<Item> v= ....;

现在我需要看看向量中有多少个唯一的"id",并创建另一个包含这些唯一id的向量(当然每个id中有1个(。

对于countig唯一id,我使用此代码。。。但是如何生成唯一id的向量呢?

std::sort(v.begin(), v.end());
int uniqueCount = std::unique(v.begin(), v.end()) - v.begin();

当然,我可以老派,做一个循环,手动将id放入向量中,同时检查id是否已经在向量中。。。但如果可能的话,我正在寻找一种干净的STL方法!

STL和lambda的一种可能方法如下,其中unique_ids是唯一id的向量。

演示

std::sort(
v.begin(), v.end(), 
[](const Item& l, const Item& r){ return (l.id < r.id);});
v.erase(
std::unique(v.begin(), v.end(), 
[](const Item& l, const Item& r) { return l.id == r.id; }),
v.end());
std::vector<int> unique_ids;
std::transform(
v.begin(), v.end(), std::back_inserter(unique_ids),        
[](const Item& item){ return item.id; });

从未排序的原始向量创建一个集合,验证两者的长度是否相同,然后从中创建一个新向量:

vector<Item> v;
set<Item> s(begin(s), end(s));
// check s.size() == v.size()  for uniques
vector<Item> result(begin(s), end(s));

最新更新