为什么不能将C ++ set迭代器强制转换为bool?

时间:2013-12-14 23:47:51

标签: c++ stl casting boolean set

对于STL集合,您似乎应该能够说:

if(s.find(x)) {
    //Something
}

而不是

if(s.find(x) != s.end()) {
    //Something
}

此外,如果set-iterators可以转换为bool(如果内部指针不为null,则为true),您将能够。为什么STL set迭代器没有这个简单的功能?这是故意遗漏的吗?

澄清:

或者,set可以只有一个set :: contains(x)方法直接返回一个bool,但这似乎也没有实现。我知道它只有几个字符,但是在s是某个函数的返回值的情况下,这可能会令人沮丧,因为需要创建一个临时变量,即(假设m的类型为map<int,set<int>>)< / p>

const set<int>& s = m[i];
return s.find(x) != s.end();

而不是

return m[i].contains(x);

return m[i].find(x);

编辑:

我没有意识到count()方法可以用作contains()。投票结束,因为这个问题没有正确地说出我真正应该问的问题:STL :: set是否有“包含”方法?

1 个答案:

答案 0 :(得分:11)

C ++标准库中的迭代器不知道它们来自哪个容器,因此他们通常不知道它们是否已经到达终点。这是故意的,以便让迭代器尽可能轻量级 - 你不需要支付你不使用的东西。 (迭代器概括了指针的思想,而指针是迭代器。)

您始终可以将自己的自知迭代器构建为一对本机迭代器。

事实上,有些人认为这样的一对或范围是讨论集合的更自然的方式,并且有库和库适配器来实现范围(例如Boost.Range)。

更新:迭代器比范围更低级,并且有争议的是哪个概念是更好的解决方案(尽管首先需要定义问题)。迭代器更灵活;例如,如果在迭代容器时改变容器,则必须“更新”所有范围对以接收新的“结束”值。 (或者以其他方式切换到完全“以范围为中心”的算法风格。)或者,您可以在迭代器中存储对容器的引用,并在每次需要时重新计算end()。您已经可以看到有很多非平凡的细节,C ++标准库只是决定不为您做出选择,而只是给您构建块来编写适合您的解决方案最好的问题。