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

Counting and retrieving repetition using algorithm and 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 方法!

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

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

vector<Item> result(begin(s), end(s));

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

DEMO

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; });