我有一个像这样的结构向量:
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));