2013-02-28 87 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