0

STL 迭代器与容器类一起使用,在概念上类似于指向存储在容器中的特定元素的指针。

以下陈述之一是正确的。哪一个?

  1. 迭代器通常保存一个地址(指针),并且应用于迭代器的 operator++ 总是增加该地址。
  2. 当迭代器it超出程序的范围时,it会被破坏,它会自动调用delete it;。
  3. 对于有效的 STL 容器 myC,当表达式 myC.end()-myC.begin() 定义良好时,它返回与 myC.size() 相同的值。
  4. 当容器超出范围时,指向它的所有迭代器都会自动修改。
  5. 对于有效的 STL 容器 myC,myC.end() 返回的迭代器引用 myC 中的最后一个有效元素。

显然解决方案是3。但我不明白为什么。有人可以详细说明为什么会这样,并可能说明为什么其他人也是错误的吗?

4

1 回答 1

3
  1. 想一想链表 ( list) 中项目地址的要求。它们不需要在内存中是连续的。

  2. delete是在指针上手动完成的事情,它不会自动发生(即使指针超出范围)(除非在某些 API 中完成)。迭代器(通常)是类,因此delete甚至不适用。迭代器会被破坏。

    您也可以将指针分类为迭代器。但delete仍然不会被自动调用。

  3. 请注意,这仅适用于随机访问迭代器。您可以按如下方式计算容器中的项目数:

    int count = 0;
    for (iterator it = begin(); it != end(); ++it, ++count) { }
    

    所以你增加begin() count到达end(),
    so begin() + count = end(),
    soend() - begin() = countcount = size(),
    so的时间end() - begin() = size()

  4. 这不是 C++ 的工作方式。尽管有一些设计模式可以实现这种行为,但通常在修改类时,您有责任确保任何依赖类在无效时得到更新。当您尝试使用超出范围的容器的迭代器时,这将导致未定义的行为。

  5. end()超过了最后一个元素,可能是出于这样的考虑:(我敢肯定还有其他原因)

    for (iterator it = begin(); it != end(); ++it)
    
于 2013-02-28T07:17:20.577 回答