2016-04-04 11 views
7

Jestem obecnie w sytuacji, w której chciałbym powielić pewne elementy w wektorze. W skrócie, mój kod jest podobny do następującego:Wstawianie w wektorze w odniesieniu do danych tego samego wektora

std::vector<MyStruct> v; 
// ... 
auto toDuplicate = std::find(v.begin(), v.end(), [](const MyStruct &s) { return true; /*In reality, a bit more complex*/ }); 
v.insert(toDuplicate, nrOfDuplicates-1, *toDuplicate); 
// Signature: insert(iterator, size_t, const value_type &) 

Tak więc, w tym przypadku, jeżeli pojemność jest mniejsza od ostatecznej pojemności, std :: vector musi realloc swoich danych wewnętrznych, że mój referencyjne wstawione dane są nieprawidłowe.

Implementacja STL, z którego aktualnie korzystam (MSVC2013), zawiera ochronę przed tego rodzaju wstawkami, ponieważ wykona kopię mojego elementu, jeśli będzie musiał ponownie przydzielić. Jednak nie jestem pewien, czy jestem w stanie polegać na tym zachowaniu, czy też wymaga ode mnie samodzielnego wykonania kopii? (Wolę unikać patrzenia na tego rodzaju błędy podczas uaktualniania do nowej implementacji STL)

Krótko mówiąc: Czy mogę wywołać insert() na wektorze z odniesieniem do elementu w tym samym wektor?

+0

Jestem głupi. Przepraszam. – Slava

Odpowiedz

4

Jesteś dobry.

jeśli spojrzeć na stole 99 (sekwencja) Wymagania kontenerów, zobaczysz, na przykład, że a.insert(p,i,j) (gdzie i i j są iteratory) ma warunek: „I oraz J nie są iteratory w”.

ale połączenie a.insert(p,n,t) gdzie n jest liczbą i t jest wartością nie ma takiego wymagania.

Zostało to wyraźnie podniesione jako problem z powrotem w C++ 11 dni, i zostało zamknięte jako NAD z uzasadnieniem "vector::insert(iter, value) jest wymagane do pracy, ponieważ standard nie daje pozwolenia, aby nie działał."

+0

'vector :: insert (iter, value)' różni się od 'insert iteratora (const_iterator pos, size_type count, const T i value)'. Jeśli operacja ma odwołanie do wartości 'toDuplicate' i nastąpi reallocation, czy to odwołanie nadal odnosi się do poprawnego elementu? – NathanOliver

+0

@NathanOliver, Tak, z tego samego powodu - nie ma wymogu, że to nie działa. –

+1

Odnośnik: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#526 – filipos

Powiązane problemy