Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;11“超过”的范围;“元组”;_C++_C++11 - Fatal编程技术网

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

C++ C++;11“超过”的范围;“元组”;,c++,c++11,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(); } } }

我正在尝试使用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*
类型。当我试图编译它时,我得到了一个严重的语法错误,我甚至无法理解。如果我尝试
for(auto&h:{H1,H2})
并使用
h[hash_func(n1,val)]
而不是
h
,它会工作(尽管它显然是错误的)。我怎样才能解决这个问题?(或者至少以一种比两次写同样的东西更优雅的方式来实现它)

从您发布的错误消息来看,错误与本文完全无关,并且是由于您试图交换
常量
int
造成的。这样做的原因是初始化器列表中的
H1[…]
访问正在复制向量,因此最终会得到一个隐式绑定到
const
引用的临时对象。因此,向量的成员也是常量

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

H1 = new vector<T>[n];
如果
hash_func
产生的结果不是
0
,则代码将访问无效内存


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

我通过使用指针解决了这个问题:

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

对我来说很好,除了一个-你不能更改带括号的初始化列表中的值。@很快,你能给我解释一下这行代码在做什么吗<代码>std::vector*v1=新的std::vector[2]{{{1,2},{3,4}
@OGH,为
std::vector
s数组分配内存并初始化数组中的向量,我不知道你可以有一个向量数组。@很快,因为它不必要的复杂。您也不需要
static
,只需声明一个向量数组即可。不使用
int*i=newint[2]而不是
inti[2]你也是吗?@Gabi看到更新了。事实上,如果编译代码,它实际上会从向量的副本中删除对象,而不是实际的向量。您可以使用
std::ref
获取引用而不是副本,但这并不能解决我在回答中提到的第二个问题。
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;
        }
    }
}