C++11中使用范围for循环遍历"tuple"

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();
        }
    }
}

H1H2vector<T>*类型。当我尝试编译时,我得到了一个令人讨厌的语法错误,我甚至无法理解。如果我尝试for(auto &h : {H1, H2})并使用h[hash_func(n1, val)]而不是h,它会工作(尽管显然是错误的)。如何修复这个问题?(或者至少以比写两遍相同的东西更优雅的方式实现它)


对我来说看起来不错,除了一个问题 - 你不能在大括号初始化列表中更改值。 - awesoon
@soon,你能否解释一下这行代码的作用吗?std::vector<int>* v1 = new std::vector<int>[2]{{1, 2}, {3, 4}}; - OGH
@OGH,为std::vector数组分配内存并初始化数组中的向量。 - awesoon
@KonradRudolph,如果您动态分配数组,可以增加其大小。 - OGH
2
因为它过于复杂了。你不需要使用 static,只需声明一个向量数组即可。你也不会使用 int* i = new int[2]; 来代替 int i[2];,对吧? - Konrad Rudolph
显示剩余9条评论
2个回答

4
从您发布的错误消息来看,该错误与此段落完全无关,而是因为您尝试交换constint引起的。原因是在初始化列表中访问H1[…]会复制向量,因此您最终会得到一个临时对象,该对象隐式绑定到const引用。因此,向量的成员也是const的。
更糟糕的是,即使您修复此错误,您的代码也无法正常工作,因为您访问了错误的类型。您的成员初始化如下:
H1 = new vector<T>[n];

H1 是指向单个向量的指针。你几乎肯定不想这样做,因为在代码中你需要使用索引来访问它:

H1[hash_func(n1, val)]

如果hash_func生成的值不是0,你的代码将访问无效的内存。

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


@Gabi 看更新。实际上,如果你的代码编译通过,它会从向量的副本中删除对象,而不是实际的向量。你可以使用std::ref来获取引用而不是副本,但这并不能解决我回答中提到的第二个问题。 - Konrad Rudolph

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接