加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 迭代`std :: multiset`的唯一元素

发布时间:2020-12-16 04:53:20 所属栏目:百科 来源:网络整理
导读:我所需要的只是知道某些东西是否存在以及它存在多少次.我将迭代现有的东西并查询其中存在多少. 到目前为止我的实现使用multiset,我做如下: std::multisetthing a;auto previous = a.end();for( auto each = a.begin(); each != a.end(); ++each ) { if( pre
我所需要的只是知道某些东西是否存在以及它存在多少次.我将迭代现有的东西并查询其中存在多少.

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

澄清

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

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

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

如果确实需要带有问号的句子,那么你可以去:有没有办法在多重集中迭代唯一元素?

解决方法

三种可能的方法:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读