2013-04-30 11 views
7

Zgodnie z referencją C++, set :: insert ma zwracać parę, w której iterator wskazuje nowo wstawiony element lub istniejący element, jeśli taki istnieje.return iterator ze std :: set :: insert() jest const?

ale mam problem z przypisaniem do iteracyjnej, jak to pokazuje proste przykłady:

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

Próbowałem G ++ i Clang i ani prace.

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

Nie mogę znaleźć coś w dokumentacji, która wskazuje, że iterator powinny szacunek do const obiektu i nic w podpisie typu będzie to oznaczać albo. Czy ktoś może mi pomóc zrozumieć, dlaczego to nie działa?

Odpowiedz

13

Dla std::set, oba powiązane typy iterator i const_iterator są stałymi dwukierunkowymi iteratorami. Powodem tego jest fakt, że zamówiono std::set. Jeśli miałbyś zmodyfikować element zestawu za pomocą iteratora, łamałbyś to porządkowanie.

Rozważ std::set z zamówionymi elementami {1, 4, 8}. Jeśli zrobiłeś coś takiego, jak *set.insert(5).first = 10; (jeśli było to dozwolone), najpierw wstawiono 5, aby uzyskać {1, 4, 5, 8}, a wstawiony element zostałby ustawiony na 10, aby uzyskać {1, 4, 10, 8}. Instancja zamawiająca została teraz uszkodzona.

Ponieważ wstawiasz 5 z insert(5), nie ma powodu do dereferencji iteratora i przypisywania do niego 5.

+0

Duh. Powinienem był o tym pomyśleć. Dzięki. W moim prawdziwym przykładzie nie było to int, jest bardziej złożonym obiektem, który chciałem zmienić na jakiś stan. – drwowe

4

Nie można modyfikować elementów zestawu w miejscu. To zamówiony pojemnik. Jego iteratory nie są przypisywane.

3

W C++ 11, ustawione iteratory odnoszą się do typów const (patrz set reference). Jeśli się nad tym zastanowić, ma to sens, ponieważ zestaw przechowuje uporządkowany element, a po prostu zmiana pewnego elementu najprawdopodobniej naruszy ograniczenia porządkowe.

Powiązane problemy