Powiel możliwe:
Does moving a vector invalidate iterators?Czy std :: vector :: data() jest zachowywany w ruchu?
Rozważmy następujące kody:
std::vector<T> prepare(T*& data) {
std::vector<T> buffer;
// Fill in buffer.
data = buffer.data();
return buffer;
}
...
T* data;
auto vec = prepare(data);
// line 12
Czy to możliwe, że vec.data() != data
w linii 12? Podobnie,
Czy to możliwe, że vec.data() != data
w linii 5?
Praktycznie oba nie są możliwe w implementacji libstdC++ i libC++, ponieważ konstruktory ruchu są zaimplementowane jako proste przypisania do wskaźników, ale wygląda na to, że standard nie określa niczego na nim (podobnie jak w przypadku Is the capacity required to be preserved when moving a std::vector?). Czy "stała złożoność" gwarantuje, że vec.data() == data
?
Rzeczy, które unieważniają iteratory/wskaźniki są dość dobrze wyliczone. –
Także pokrewne: http://stackoverflow.com/questions/4124989/does-stdvectorswap-invalidate-iterators –