C++ C++;11“超过”的范围;“元组”;
我正在尝试使用C++11特性实现一个哈希类。我不会重复使用stl的哈希,因为这是学校的作业。我正在尝试这样做: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(); } } }
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;
}
}
}