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

时间:2013-02-07 13:09:37

标签: c++ c++11 multiset

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

到目前为止,我的实施使用了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;
}

澄清

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

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

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

如果确实需要带有问号的句子,那么你去:有没有办法在multiset上迭代唯一元素?

1 个答案:

答案 0 :(得分:13)

三种可能的方法:

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