【问题标题】:Is there any way to validate the iterator of an STL container? [duplicate]有什么方法可以验证 STL 容器的迭代器吗? [复制]
【发布时间】:2013-01-05 04:40:05
【问题描述】:

可能重复:
C++ Best way to check if an iterator is valid

假设我有一个函数,它将迭代器作为其唯一参数,如下所示。

void DoSomethingWithIterator(std::vector<int>::iterator iter)
{
   // Check the pre-condition
   assert( /* how to validate iter here? */ )

   // Operate on iter afterwards
   ..
}

我如何知道iter 是否有效。有效,我的意思是它指向向量内的现有元素,例如,从 m_intVector.begin()m_intVector.end()

【问题讨论】:

  • @David - 也许吧。未定义的行为几乎可以做任何事情,包括抛出某种异常。
  • 你是如何得到这个可能无效的迭代器的?一般来说,确保不会创建错误的迭代器比稍后测试它们要容易得多。
  • 您能做的最好的事情是遍历向量测试,以确保向量中的任何迭代器与对象的相等性。
  • @jogojapan:相关?重复。

标签: c++ stl


【解决方案1】:

一般来说,你不能这样做。 C++ 类型旨在最大限度地提高效率,并且不包含此类额外信息。

例如,vector 的迭代器很可能等价于指向元素的指针(在我的机器上就是这种情况,使用 g++ 4.7.2)。

【讨论】:

  • 这不是“等价于”原始指针。我认为这是一个实现定义的问题,这就是为什么你不能比较一个迭代器和一个原始指针,例如。
  • 我说“很可能是”,具体取决于实现。在我的机器上,它按位等于指针。虽然编译器仍然将它们视为不同的类型,但迭代器显然无法保存更多信息。
  • @EricZ:这是正确的,但在“例如”和“可能是”的上下文中说的话是有效的。
  • 对,我只是想澄清一下。
  • @Non-StopTimeTravel,“例如”一开始就在那里吗? ;)
【解决方案2】:

> 我的意思是它指向向量内的一个现有元素,例如,从m_intVector.begin()m_intVector.end()

当然。只需遍历m_vector 的内容,并将每个迭代器与iter 进行比较。

for ( std::vector<int>::iterator it = m_intVector.begin (); it != m_intVector.end (); ++it )
    if ( it == iter ) return true;
return false;

但我怀疑你不会愿意为这种支票付费。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 2011-06-22
    • 2010-10-17
    • 2018-09-17
    • 2012-08-10
    • 2019-04-19
    • 2013-04-16
    相关资源
    最近更新 更多