2013-04-07 48 views
4

我想實現一個使用C++ 11功能的哈希類。我不會重複使用stl的哈希,因爲這是一個學校作業。我試圖做到這一點:C++ 11範圍超過「元組」

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,它可以工作(雖然它顯然是錯誤的)。我怎樣才能解決這個問題? (或者至少以比同樣的東西更優雅的方式實現它兩次)

+0

[外貌](http://liveworkspace.org/code/3IrjlE$0)爲我好,只有一個 - 你不能更改braced-init-lists中的值。 – soon 2013-04-07 09:29:04

+0

@soon,請你向我解釋一下這行代碼是幹什麼的? 'std :: vector * v1 = new std :: vector [2] {{1,2},{3,4}};' – OGH 2013-04-07 09:35:25

+0

@OGH,爲'std :: vector'數組分配內存,初始化數組中的向量 – soon 2013-04-07 09:39:41

回答

4

從您發佈的錯誤消息中,錯誤與此段落完全無關,並且由於您試圖交換constint。原因是您的初始化列表中的H1[…]訪問權限爲複製這些向量,因此您最終得到一個臨時對象,該對象隱式綁定到const引用。因此,矢量的成員也是const

這比這更糟糕:即使您修復此錯誤,您的代碼也無法正常工作,因爲您訪問的是錯誤的類型。你的成員被初始化如下:

H1 = new vector<T>[n]; 

H1是一個指向單個矢量。你幾乎肯定不希望,從那以後在你的代碼中使用索引訪問:

H1[hash_func(n1, val)] 

如果hash_func產生比0代碼訪問無效的內存的任何其他。

爲什麼H1H2反正呢? 請勿使用手動內存管理。只需使用簡單的向量。

+0

@Gabi查看更新。實際上,如果編譯的代碼實際上會從矢量的*副本中刪除對象,而不是實際的矢量。您可以使用'std :: ref'來獲取引用而不是副本,但這不會解決我的答案中提到的第二個問題。 – 2013-04-07 10:20:36

+0

這正是我所需要的。很好的答案,謝謝! – 2013-04-07 10:21:13

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