使用算法和 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 的向量。
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; });
我有一个这样的结构向量:
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 的向量。
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; });