For testing purposes, I created a bit of disordered_set and tried to iterate over the set. The set contains its own class:
class Student { private: int matrNr; string name; public: Student( const int& matrNr = 0, const string& name = "" ) : matrNr( matrNr ), name( name ) {} void setNr( const int& matrNr ) { this->matrNr = matrNr; } ... };
I inserted some elements and tried changing objects during iteration:
unordered_set<Student, meinHash> meineHashTable; meineHashTable.emplace( 12, "Fred" ); meineHashTable.emplace( 22, "Barney" ); meineHashTable.emplace( 33, "Wilma" ); for (int i = 0; i < meineHashTable.bucket_count(); i++) { cout << "Bucketnummer: " << i << endl; unordered_set<Student, meinHash>::local_iterator iter; // not constant?!? if (meineHashTable.bucket_size( i ) > 0) { for (iter = meineHashTable.begin( i ); iter != meineHashTable.end( i ); iter++) { //const_cast<Student&>(*iter).setNr( 1234 ); //This does work iter->setNr( 1234 ); //This does not work } } else { cout << "An empty Bucket" << endl; } }
I used local_iterator (and not const_local_iterator), but still I cannot change the objects. For some reason, an iterator refers to a persistent object.
My question now is: why is this so? If a normal iterator refers to a const object, then which one is different between a constant and a non-constant iterator?
Tested with VisualStudio 2013 and minGW.
Thanks in advance for any help :-)
EDIT: Hash Functor:
struct meinHash { size_t operator()( const Student& s ) { return s.getNr(); } };
For future seekers on this topic who have the same question, here is an example output if you change matrNr with a strong one:
const_cast<Student&>(*iter).setNr( 5 );
and try displaying it:
unordered_set<Student, meinHash>::local_iterator iter = meineHashTable.find( 5 ); iter->display();
you can get something like:
Bucketnummer: 0
Empty bucket
Bucketnummer: 1
Matrikelnummer: 5
Name: Wilma
Bucketnummer: 2
Empty bucket
Bucketnummer: 3
Empty bucket
Bucketnummer: 4
Matrikelnummer: 5
Name: Fred
Bucket Weight: 5
Empty bucket
Bucketnummer: 6
Matrikelnummer: 5
Name: Barney
Bucket Weight: 7
Empty bucket
// Unwanted conclusion; -)
Matrikelnummer: -842150451
Name:
c ++ c ++ 11 stl unordered-set
Milania
source share