1. 程式人生 > >deque叠代器失效的困惑?

deque叠代器失效的困惑?

優化 sage 數據 validate push_back perl real enc 詭異

在實現LRU算法的時候lru_list 開始用的是deque 可是由於害怕其在插入刪除上的叠代器失效情況的詭異情況。遂用list取代之。

在數據量比較大的時候性能不是非常好。性能優化分析的時候決定用deque替換回來。於是對deque叠代器失效的情況好好研究了一下:


c++ primer如此寫道:

1.在deque容器首部或者尾部插入元素不會使得不論什麽叠代器失效。?
2.在其首部或尾部刪除元素則僅僅會使指向被刪除元素的叠代器失效。

?
3.在deque容器的不論什麽其它位置的插入和刪除操作將使指向該容器元素的全部叠代器失效。



stackoverflow上對此的討論:Confusion on iterators invalidation in deque



I‘m bit confused regarding iterator invalidation in deque. (In the context of?this?question)

Following is the excerpts from -- The C++ Standard Library: A Tutorial and Reference, By Nicolai M. Josuttis

Any insertion or deletion of elements?other than

?at the beginning or end invalidates all pointers, references, and iterators that refer to elements of the deque.

Following is the excerpts from?SGI?site:

The semantics of iterator invalidation for deque is as follows. Insert (including?push_front?and?push_back) invalidates all iterators that refer to a deque. Erase in the middle of a deque invalidates all iterators that refer to the deque. Erase at the beginning or end of a deque (including?pop_front

?and?pop_back) invalidates an iterator only if it points to the erased element.

IMHO, deque is collection of blocks with first block growing in one direction and the last block in opposite direction.

  -   -  -  
  -   -  -
  |   -  -  ^
  |   -  -  |
  V   -  -  |
      -  -  -
      -  -  -

push_back, push_front?should not have any impact on deque iterators ( I agree with Josuttis).

What is the correct explanation?

what the standard say on this?


完美的答案:

IMHO, deque is collection of blocks with first block growing in one direction and the last block in opposite direction.

Your opinion is your prerogative, but it‘s wrong. :)

deque?is such a container?semantically, but in terms of implementation it‘s designed to be implemented by one or more blocks of memory.?C++‘s iterator invalidation rules?come from implementation, so this is why. Arguably this is a small abstraction leak but, well, whatever.

The SGI STL documentation is not the proper documentation to read, because?the SGI STL is not the C++ Standard Library. Unfortunately, Josuttis is one of those people who calls it "the STL", and this has led to your confusion.


Following is the excerpts from -- The C++ Standard Library: A Tutorial and Reference, By Nicolai M. Josuttis

Any insertion or deletion of elements?other than?at the beginning or end invalidates all pointers, references, and iterators that refer to elements of the deque.

Put simply, this passage from Josuttis is?misleading?in implying that the insertion or deletion of elements thatare?at the beginning or end do?not?invalidate pointers, references or iterators … though it‘s worth noting that he never comes out and asserts this outright.


Here are the real, proper, official rules for?std::deque:

C++03

  • Insertion: all iterators and references are invalidated, unless the inserted member is at an end (front or back) of the deque (in which case all iterators are invalidated, but references to elements are unaffected) [23.2.1.3/1]

  • Erasure: all iterators and references are invalidated, unless the erased members are at an end (front or back) of the deque (in which case only iterators and references to the erased members are invalidated) [23.2.1.3/4]

  • Resizing: as per insert/erase [23.2.1.2/1]

C++11

  • Insertion: all iterators and references are invalidated, unless the inserted member is at an end (front or back) of the deque (in which case all iterators are invalidated, but references to elements are unaffected) [23.3.3.4/1]

  • Erasure: erasing the last element invalidates only iterators and references to the erased elements and the past-the-end iterator; erasing the first element invalidates only iterators and references to the erased elements; erasing any other elements invalidates all iterators and references (including the past-the-end iterator) [23.3.3.4/4]

  • Resizing: as per insert/erase [23.3.3.4/1]


Further reading

  • Iterator invalidation rules
  • What‘s this STL vs. "C++ Standard Library" fight all about?



deque叠代器失效的困惑?