我正在尝试使用C ++ 11功能实现哈希类。我不是在重复使用stl的哈希,因为这是一项学校作业。我正在尝试这样做:
for(auto &h : {H1[hash_func(n1, val)], H2[hash_func(n2, val)]}) {
for(auto &x : h) {
if(x == val) {
swap(x, h.back());
h.pop_back();
}
}
}
H1
和H2
属于vector<T>*
类型。当我尝试编译它时,我得到一个令人讨厌的语法错误,我甚至无法理解。如果我尝试使用for(auto &h : {H1, H2})
并使用h[hash_func(n1, val)]
代替h
,则可行(虽然这显然是错误的)。我怎样才能解决这个问题? (或者至少以比两次写同样的东西更优雅的方式实现它)
答案 0 :(得分:4)
根据您发布的错误消息,错误与此段落完全无关,并且是由于您尝试交换 const
int
而导致的。原因是初始化列表中的H1[…]
访问权限是复制向量,因此最终会得到一个临时对象,该对象隐式绑定到const
引用。因此,向量的成员也是const
。
更糟糕的是:即使您修复了此错误,您的代码也无法正常工作,因为您访问的类型错误。您的成员初始化如下:
H1 = new vector<T>[n];
H1
是指向单个向量的指针。您几乎肯定不希望自那时起您在代码中使用索引访问它:
H1[hash_func(n1, val)]
如果hash_func
产生0
以外的任何内容,则代码会访问无效内存。
为什么H1
和H2
指针呢? 不要使用手动内存管理。只需使用普通向量。
答案 1 :(得分:0)
我设法通过转向指针来解决这个问题:
for(auto h : {&H1[hash_func(n1, val)], &H2[hash_func(n2, val)]}) {
for(auto &x : *h) {
if(x == val) {
swap(x, h->back());
h->pop_back();
break;
}
}
}