【发布时间】:2018-09-06 19:56:24
【问题描述】:
如何在std::set<int> ids 中找到not 的第一个值h,以便将结果限制在[0, *ids.rbegin() + 1] 范围内。
我看到这是一个相当简单的问题,但我还没有找到任何匹配的问题。基本上我想要ids 的倒置集,以便我可以使用它们。
到目前为止,我有以下内容:
#incldue <set>
std::set<int> ids;
int h = 0;
for(; !ids.empty() && (h <= *ids.rbegin() + 1); ++h) {
if(!ids.count(h)) {
break;
}
}
// h is now smallest value not in ids.
我怀疑这会进一步改进,例如不需要循环?
@edit:澄清集合中的值:在我的用例中,算法生成的值被插入集合中。我真的应该说std::set<unsigned int>。我很高兴就这个问题进行了如此多的讨论!
【问题讨论】:
-
使用 sorted
std::vector,您可以随机访问,并且可以检查中间元素,然后只检查左侧或右侧。但您无法从std::set... 访问随机元素 -
顺便说一句,您可以在
std::set上进行迭代,而不是进行线性查找。 -
你不需要
int h = ids.begin() - 1;吗? -
@NathanOliver:如果
0在集合中,这不会导致-1吗? -
@NathanOliver:这不会在一组
{0,1,2,4,5}中检测到3