2016-04-04 38 views
7

Sono attualmente in una situazione in cui vorrei duplicare alcuni elementi in un vettore. In breve, il mio codice è simile al seguente:Inserimento nel vettore con riferimento ai dati dello stesso vettore

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 &) 

Quindi, in questo caso, se la capacità è inferiore alla capacità finale, lo std :: vector deve realloc dei propri dati interni rendendo il mio riferimento alla dati inseriti non validi.

L'implementazione dell'STL attualmente in uso (MSVC2013) contiene protezione contro questo tipo di inserti poiché eseguirà una copia del mio elemento se è necessario realizzarlo. Tuttavia, non sono sicuro di poter fare affidamento su questo comportamento o mi impone di eseguire prima una copia da solo? (Preferisco evitare di guardare questo tipo di bug durante l'aggiornamento a una nuova implementazione STL)

In breve: Sono autorizzato a chiamare insert() su un vettore con un riferimento a un elemento in quello stesso vettore?

+0

Sono stupido. scusa. – Slava

risposta

4

Stai bene.

se si guarda al tavolo 99 (requisiti di contenitore di sequenza), si veda, ad esempio, che a.insert(p,i,j) (dove i e j sono iteratori) ha la precondizione: "i e j non sono iteratori in una".

ma la chiamata a.insert(p,n,t) dove n è un conteggio e t è un valore non ha tale requisito.

Questo problema è stato sollevato esplicitamente come problema nei 11 giorni di C++, ed è stato chiuso come NAD con la motivazione "vector::insert(iter, value) è necessario per funzionare perché lo standard non dà il permesso di non funzionare".

+0

'vector :: insert (iter, value)' è diverso da 'iterator insert (const_iterator pos, size_type count, const T e value)'. Se l'op ha un riferimento al valore di 'toDuplicate' e si verifica una riallocazione, quel riferimento si riferisce ancora all'elemento corretto? – NathanOliver

+0

@NathanOliver, Sì, per lo stesso motivo: non è necessario che non funzioni. –

+1

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