2013-04-30 9 views
7

In base al riferimento C++, set :: insert deve restituire una coppia in cui l'iteratore punta all'elemento appena inserito o all'elemento esistente se tale esiste.return iterator da std :: set :: insert() è const?

ma sto avendo un problema assegnando al iteratore, in quanto questo semplice esempio mostra:

int main() { 
    set<int> set; 
    *set.insert(5).first = 5; 
    return 0; 
} 

Ho provato G ++ e Clang e né opere.

set.cc:7:24: error: read-only variable is not assignable 
    *set.insert(5).first = 5; 
    ~~~~~~~~~~~~~~~~~~~~^

non riesco a trovare nulla nella documentazione che indica che l'iteratore deve deferenza a un oggetto const, e nulla nella firma tipo indicherebbe questa operazione. Qualcuno può aiutarmi a capire perché questo non funziona?

risposta

13

Per std::set, entrambi i tipi associati iterator e const_iterator sono iteratori bidirezionali costanti. Il motivo per questo è perché std::set è ordinato. Se dovessi modificare un elemento del set attraverso un iteratore, violerebbe questo ordine.

Considerare uno std::set con elementi ordinati {1, 4, 8}. Se hai fatto qualcosa come *set.insert(5).first = 10; (se fosse permesso), sarebbe stato inserito prima 5 per ottenere {1, 4, 5, 8} e quindi l'elemento inserito sarebbe stato impostato su 10 per ottenere {1, 4, 10, 8}. L'invariante dell'ordine è stato ora rotto.

Poiché si sta inserendo 5 con insert(5), non c'è motivo di dereferenziare l'iteratore e assegnare 5 ad esso.

+0

Duh. Avrei dovuto pensarci. Grazie. Nel mio esempio reale, non era un int, era un oggetto più complesso su cui volevo cambiare qualche stato. – drwowe

4

Non è possibile modificare i membri di un set in posizione. È un contenitore ordinato. I suoi iteratori non sono assegnabili.

3

In C++ 11, gli iteratori di impostazione si riferiscono ai tipi const (vedere set reference). Se ci pensate, ha senso, poiché un set memorizza il suo elemento ordinato, e semplicemente la modifica di un certo elemento molto probabilmente violerebbe i vincoli degli ordini.

Problemi correlati