Container set - Objekte manipulieren
-
Hallo,
ich habe das problem, dass set (STL) iteratoren per definition const_iteratoren sind, d.h. nicht änderbar. Kann man das umgehen?
Siehe Bsp.#include <iostream> #include <set> using namespace std; class SNum { private : int num; int test; public: SNum( int num ) { this->num = num ; test = 0;}; ~SNum(){}; void set_num( int num ){ this->num = num; }; int get_num() const { return num;}; void set_test( int test ){ this->test = test; }; int get_test() const { return test;}; friend bool operator < (const SNum& a, const SNum& b) { if(a.get_num() < b.get_num() ) return true; else return false; } void operator=(const SNum& o){ this->num = o.num; } }; int main() { set<SNum> sN; set<SNum>::iterator sN_it; sN.insert(SNum(2)); sN.insert(SNum(1)); const SNum* s1 = 0; SNum* s2 = 0; for ( sN_it = sN.begin(); sN_it != sN.end(); ++ sN_it ) { sN_it->set_test(42); // das geht nicht, compiler (wegen iterator == const_iterator?) s1 = &*sN_it; s1->set_test(42); // das geht nicht, compiler (wegen const) s2 = &*sN_it; // das geht nicht, compiler da deklaration ohne const s2->set_test(42)); cout << sN_it->get_num() << " " << sN_it->get_test() << endl; } return 0; }schon ml vielen Dank
-
struct A { mutable int i; void a(int value) const { i = value; } };Aufpassen die Sortierung nicht zu killen.
-
Hmm, ich könnte schwören, dass das bisher laut Standard erlaubt war und erst in C++11 iterator==const_iterator gesetzt wurde. Das Verhalten war dann undefiniert, wenn man die Ordnung durcheinander brachte. Aber jetzt finde ich die entsprechende Stelle im Standard nicht. Verwechsele ich da etwas mit einem anderen Container?
-
<---> schrieb:
ich habe das problem, dass set (STL) iteratoren per definition const_iteratoren sind, d.h. nicht änderbar. Kann man das umgehen?
Eine Änderung innerhalb eines sets müsste eine komplette Umstrukturierung erzwingen (Set dient ja unter anderem der Schnellen Suche und ist als Suchbaum aufgebaut). Eine Variante könnte wohl sein das du statt einer direkten Objektänderung dir das Objekt ausliest, dieses aus dem set löschst und dann wieder einfügst. Wenn du das allerdings häufig tust, ist die Frage ob ein set überhaupt für deine Anforderungen der richtige Container ist.