出于测试目的,我创建了一个小 unordered_set 并尝试迭代该集合。该集合包含一个自己的类:
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;
}
...
};
我插入了一些元素并尝试在迭代期间更改对象:
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;
}
}
我使用了 local_iterator(而不是 const_local_iterator),但我仍然无法更改对象。由于某些原因,迭代器仍然指向一个常量对象。
我现在的问题是:为什么会这样?如果普通迭代器引用一个 const 对象,那么 const 和非 const 迭代器有什么区别?
使用 VisualStudio 2013 和 minGW 测试。
提前感谢您的帮助:-)
编辑:哈希函子:
struct meinHash {
size_t operator()( const Student& s ) {
return s.getNr();
}
};
对于将来有相同问题的该主题的发现者,如果您将 matrNr 更改为暴力,以下是一些示例输出:
const_cast<Student&>(*iter).setNr( 5 );
并尝试显示它:
unordered_set<Student, meinHash>::local_iterator iter = meineHashTable.find( 5 );
iter->display();
你可能会得到类似的东西:
桶号:0
一个空桶
桶数:1
Matrikelnummer: 5
姓名:威尔玛
桶数:2
一个空桶
桶数:3
一个空桶
桶数:4
Matrikelnummer: 5
姓名:弗雷德
桶数:5
一个空桶
桶数:6
Matrikelnummer: 5
姓名:巴尼
桶数:7
一个空桶
//不想要的输出;-)
Matrikel 号码:-842150451
姓名: