迭代`std :: multiset`的独特元素

And*_*uel 10 c++ multiset c++11

我所需要的只是知道某些东西是否存在以及它存在多少次.我将迭代现有的东西并查询其中存在多少.

到目前为止我的实现使用multiset,我做如下:

std::multiset<thing> a;
auto previous = a.end();
for( auto each = a.begin(); each != a.end(); ++each ) {
    if( previous == a.end() || *previous != *each ) {
        a.count(*each);
    }
    previous = each;
}
Run Code Online (Sandbox Code Playgroud)

澄清

我有一个things 的向量.但是他们有时会重复这个价值,我想要迭代唯一的 things并为每个独特的事做点什么.这个"东西"需要知道它thing在矢量上出现的时间量.

我上面发布的代码就是我现在如何解决我的问题,它似乎并不是我想要的最优雅的方式.

我只是遵循Stackoverflow准则:我告诉我的问题是什么,我告诉我(尝试过)的解决方案.

如果确实需要带有问号的句子,那么你可以去:有没有办法迭代一个独特的元素multiset

us2*_*012 13

三种可能的方法:

  • 使用std::unique创造独特价值的临时集合.这可能会使代码更具可读性,但效率更低.
  • 通过使用std::multiset::upper_bound而不是增量来推进你的迭代器:for( auto each = a.begin(); each != a.end(); each=a.upper_bound(*each))- 这样你就不需要if检查你的循环内部,加上它的大小保证是对数的.非常酷(在我查看之前不知道).对于以下建议,所有信用都归于@MarkRansom:使用std::upper_boundfrom <algorithm>,您可以指定查找上限的范围.在您的情况下,您已经有了一个很好的候选者来开始该范围,因此这种方法可能更有效,具体取决于标准库中的实现.
  • 如果这是你和以前解决一个真正的性能问题仍然不够好,可考虑改用map<thing, unsingned>甚至unordered_map<thing,unsigned>unsigned刚刚跟踪等同数量的thing你在那.这意味着重写您的插入/删除代码.

  • @AndréPuel如果'multiset`中的平均重复次数预计很小,那么`upper_bound`的自由形式可能比成员函数更快,因为你指定了搜索的开始.PS我觉得有一个错字,'*它'应该是'*each`. (3认同)