我所需要的只是知道某物是否存在以及它存在了多少次。我将迭代现有的事物并查询其中存在多少。
到目前为止我的实现使用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 指南:我告诉我我的问题是什么,然后我告诉我我的(尝试过的)解决方案。
如果确实需要带问号的句子,那么您可以:Is there a way to iterate over unique elements over amultiset
?
三种可能的方法:
- Use
std::unique
创建唯一值的临时集合。这可能会使代码更具可读性,但效率较低。
- 通过使用来推进你的迭代器
std::multiset::upper_bound
而不是增量:for( auto each = a.begin(); each != a.end(); each=a.upper_bound(*each))
- 这样你就不需要if
检查你的循环内部,加上它保证是大小的对数。非常酷(在我查之前不知道)。对于以下建议,所有功劳归于@马克兰塞姆: Using std::upper_bound
from <algorithm>
,您可以指定要在其中查找上限的范围。就您而言,您已经有一个很好的候选范围作为该范围的开始,因此此方法可能会更有效,具体取决于标准库中的实现。
- 如果这对您来说是一个真正的性能问题,并且以前的解决方案仍然不够好,请考虑切换到
map<thing, unsigned>
甚至unordered_map<thing,unsigned>
哪里的unsigned
只是记录等价的数量thing
你有。这意味着重写您的插入/删除代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)