【问题标题】:Counting and retrieving repetition using algorithm and lambda使用算法和 lambda 计数和检索重复
【发布时间】:2018-12-03 13:36:55
【问题描述】:

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

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 方法!

【问题讨论】:

  • 嗯,也许你应该阅读更多关于 std::unique 真正做什么的信息。

标签: c++ stdvector stl-algorithm


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      相关资源
      最近更新 更多