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

前端之家收集整理的这篇文章主要介绍了为什么不能将C set迭代器强制转换为bool?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
对于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> ;&GT)

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是否有“包含”方法

解决方法

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

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

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

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

猜你在找的C&C++相关文章