gpt4 book ai didi

c++ - unordered_set 非 const 迭代器

转载 作者:可可西里 更新时间:2023-11-01 16:27:25 26 4
gpt4 key购买 nike

出于测试目的,我创建了一个小的 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();

你可能会得到这样的东西:

Bucketnummer: 0

An empty Bucket

Bucketnummer: 1

Matrikelnummer: 5

Name: Wilma

Bucketnummer: 2

An empty Bucket

Bucketnummer: 3

An empty Bucket

Bucketnummer: 4

Matrikelnummer: 5

Name: Fred

Bucketnummer: 5

An empty Bucket

Bucketnummer: 6

Matrikelnummer: 5

Name: Barney

Bucketnummer: 7

An empty Bucket

//The not wanted output ;-)

Matrikelnummer: -842150451

Name:

最佳答案

setunordered_set 都有只读键。很容易看出为什么会这样 - 如果键值发生变化,数据结构会将其归档到错误的位置,您将无法再找到它。

根据您的示例,假设您的散列函数仅返回 matrNr 字段。当哈希值发生变化时,对 1234 的任何查找都将失败,因为该哈希桶中没有存储任何内容。

可以更改对象的某些未用于制作哈希键的部分,但这会导致可能难以追踪错误。标准委员会决定通过将整个 key 设为常量来消除这种可能性。

有两种方法可以绕过这个限制。第一种是将键从值中分离出来,并使用 mapunordered_map 代替。第二种是从集合中删除项目并在修改后重新插入。

关于c++ - unordered_set 非 const 迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18704129/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com