Eventuali duplicati:
Does moving a vector invalidate iterators?È std :: vector :: data() preservato spostandosi?
Considerate i seguenti codici:
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
E 'possibile che vec.data() != data
in linea 12? Allo stesso modo,
std::vector<T> buffer;
// ... Fill in buffer ...
T* data = buffer.data();
auto vec = std::move(buffer);
// line 5
E 'possibile che vec.data() != data
in linea 5?
In pratica entrambi non sono possibili nell'implementazione di libstdC++ e libC++, poiché i costruttori di spostamento sono implementati come semplici assegnazioni di puntatori, ma sembra che lo standard non specifichi nulla su di esso (simile a Is the capacity required to be preserved when moving a std::vector?). Può la "costante complessità" garantire che vec.data() == data
?
Le cose che invalidano gli iteratori/puntatori sono elencate abbastanza bene. –
Relativi anche: http://stackoverflow.com/questions/4124989/does-stdvectorswap-invalidate-iterators –