容器和迭代器(多选)

时间:2013-02-28 06:37:19

标签: c++ iterator containers

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

以下陈述之一是真实的。哪一个?

  1. 迭代器通常包含一个地址(指针),而应用于迭代器的operator ++总是会增加该地址。
  2. 当迭代器it超出程序范围时,it会被破坏,会自动调用delete it;。
  3. 对于有效的STL容器myC,当表达式myC.end() - myC.begin()被很好地定义时,它返回与myC.size()相同的值。
  4. 当容器超出范围时,所有指向它的迭代器都会自动修改。
  5. 对于有效的STL容器myC,myC.end()返回的迭代器引用myC中的最后一个有效元素。
  6. 显然解决方案是3.但我不明白为什么。有人可以详细说明为什么会这样,并可能说明为什么其他人也是假的?

1 个答案:

答案 0 :(得分:3)

  1. 考虑链表(list)中项目地址的要求。它们不需要在内存中顺序。

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

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

  3. 请注意this only applies to random access iterators。您可以按如下方式计算容器中的项目数:

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

    所以你增加begin() count次来到end()
    所以begin() + count = end()
    所以end() - begin() = countcount = size()
    所以end() - begin() = size()

  4. 这不是C ++的工作方式。尽管存在设计模式来实现此行为,但通常在修改类时,您有责任确保在失效时更新任何相关类。当您尝试使用超出范围的容器的迭代器时,这将导致未定义的行为。

  5. end()已经过了最后一个元素,可能会考虑到这样的事情:(我确信还有其他原因)

    for (iterator it = begin(); it != end(); ++it)