C ++ 11范围超过“元组”

时间:2013-04-07 09:07:29

标签: c++ c++11

我正在尝试使用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();
        }
    }
}

H1H2属于vector<T>*类型。当我尝试编译它时,我得到一个令人讨厌的语法错误,我甚至无法理解。如果我尝试使用for(auto &h : {H1, H2})并使用h[hash_func(n1, val)]代替h,则可行(虽然这显然是错误的)。我怎样才能解决这个问题? (或者至少以比两次写同样的东西更优雅的方式实现它)

2 个答案:

答案 0 :(得分:4)

根据您发布的错误消息,错误与此段落完全无关,并且是由于您尝试交换 const int而导致的。原因是初始化列表中的H1[…]访问权限是复制向量,因此最终会得到一个临时对象,该对象隐式绑定到const引用。因此,向量的成员也是const

更糟糕的是:即使您修复了此错误,您的代码也无法正常工作,因为您访问的类型错误。您的成员初始化如下:

H1 = new vector<T>[n];

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

H1[hash_func(n1, val)]

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

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

答案 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;
        }
    }
}