【问题标题】:C++ STL, constant iterators, find()C++ STL、常量迭代器、find()
【发布时间】:2013-06-04 20:51:54
【问题描述】:

我目前正在学习 STL,但我对 find 和 const 迭代器有一些不确定性。 假设我有一个查找功能:

some_stl_container::const_iterator found = myContainer.find(value);

在那之后,我应该对照另一个 const_iterator 检查我为 found 得到的东西,还是它 对简单的迭代器进行检查是有效的。 基本上这样做会有什么区别:

if(found!=myContainer.cend())

还有这个:

if(found!=myContainer.end())

第一个看起来更准确(至少对我来说),但第二个应该也可以正常工作,对吧?

【问题讨论】:

标签: c++ stl iterator find constants


【解决方案1】:

所有标准库容器都满足Container::iterator 可转换为Container::const_iterator 的要求。所以这两个比较都是有效的,并且会产生相同的结果。

来自 §23.2.1 - 表 96

X::iterator...任何满足前向迭代器的迭代器类别 要求。可转换为X::const_iterator

【讨论】:

  • 有趣的是,我只是试图在标准中找到x.cend() == X::const_iterator(x.end()) 的确认。并且没有找到(可能是我遗漏了一些明显的逻辑结论)。根据定义x.cend() == const_cast<X const&>(x).end(),但我不明白这如何证明第一个断言。
  • @SergeDundich 我不确定我是否理解你的问题。我引用的内容明确指出,在容器方面,iterator 可以转换为const_iterator。如果您问什么允许我们使用 operator== 来比较 2 个迭代器,请参考我的 this answer
【解决方案2】:

检查您的迭代器是否与myContainer.end() 不同是可以的。 cendcbegin 方法仅用于显式获取 const 迭代器,因此对您的情况没有影响。

请注意,您可以在 c++11 中执行 auto found = myContainer.find(value) 来推断迭代器类型,并且有些人会争辩说 标准库 是正确的名称(不是 STL)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-01-05
  • 2021-09-03
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多