4

我正在尝试使用 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,它会起作用(尽管它显然是错误的)。我怎样才能解决这个问题?(或者至少以比两次编写相同内容更优雅的方式实现它)

4

2 回答 2

4

从您发布的错误消息来看,该错误与此段落完全无关,并且是由您尝试 swap 引起的。原因是您在初始化列表中的访问是复制向量,因此您最终会得到一个隐式绑定到引用的临时对象。因此,向量的成员也是如此。const intH1[…]constconst

更糟糕的是:即使你修复了这个错误,你的代码也不会工作,因为你访问的是错误的类型。您的成员初始化如下:

H1 = new vector<T>[n];

H1是指向单个向量的指针。从那时起,您几乎肯定不希望在您的代码中使用索引访问它:

H1[hash_func(n1, val)]

如果hash_func产生除0您的代码以外的任何内容访问无效内存。

为什么是H1H2指针呢?不要使用手动内存管理。只需使用普通向量。

于 2013-04-07T10:14:41.610 回答
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;
        }
    }
}
于 2013-04-07T10:17:07.433 回答