2013-02-28 59 views
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.但我不明白为什么。有人可以详细说明为什么会出现这种情况,并可能说明为什么其他人也是虚假的?

+0

你明白任何的五? – Beta 2013-02-28 06:39:17

+0

你能解释一下每个实例中究竟发生了什么吗?3中“明确定义”是什么意思? – 2013-02-28 06:50:45

+0

@BobJohn它意味着迭代器支持算术相减,这对一类迭代器[RandomAccessIterators](http://en.cppreference.com/w/cpp/concept/RandomAccessIterator)是可能的。 – WhozCraig 2013-02-28 07:26:55

回答

3
  1. 考虑链接列表中的项目地址要求(list)。他们不需要在记忆中连续。

  2. deletedelete是手动完成的指针,它不会自动发生(即使指针超出范围)(除非在某些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() = count,并count = size()
    所以end() - begin() = size()

  4. 这不是C++的工作方式。虽然有设计模式可以实现这种行为,但通常在修改类时,确保任何相关类在更新失败时都有责任。当您尝试使用超出范围的容器的迭代器时,这会导致未定义的行为。

  5. end()是过去的最后一个元素,可能有这样的事情记:(我敢肯定,除其他原因外)

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

对于#3,“当表达式myC.end() - myC.begin()被很好地定义”意味着它们是随机访问迭代器。所以确实如此。 – 2013-02-28 07:21:29

+0

通过您自己的列表,如果表达式myC.end() - myC.begin()是*问题定义好的*,那么它必须是(并且只能是)一个RandomAccessIterator,点#3是**真**,而不是假。 – WhozCraig 2013-02-28 07:22:56

+0

误读了那个,编辑过。 – Dukeling 2013-02-28 08:50:17