2013-12-08 74 views
0

我正在編寫一個程序,並且我可以發誓Map返回的值不同於我放入的值。我並不真的相信這是事實,但是我錯過了某些東西我應該在使用地圖時做。返回不同值的C++映射

choicesstd::map<int,Board>choiceboardBoard,和getId()會返回一個唯一的哈希INT。

這裏是我輩代碼的一部分(當我建立我的地圖):

if (choices.find(board.getId())!=choices.end())//If choices already contains the new state 
    std::cout<<"Error!"<<std::endl; 
checkGoodMove(board,choice); 
choices.insert(std::pair<int,Board>(board.getId(),choice)); 

那麼,這是代碼,當我進入我的地圖:

if (choices.find(board.getId())==choices.end()) 
    std::cout<<"Error!"<<std::endl; 
auto choice = choices[board.getId()]; 
checkGoodMove(board, choice); 
return choice; 

這裏發生了什麼:

  1. 我一次構建我的整個地圖。唯一的插入功能就是你所看到的功能。
  2. 當我建立我的地圖時,我確認board.getID()返回一個唯一的值,因爲「Error」從不打印出來。
  3. 我還驗證我的地圖包含ID之前我訪問它,因爲,再次,「錯誤」從不打印。
  4. checkGoodMove驗證從第一狀態和第二狀態的移動是有效的移動。它從來沒有建立我的地圖時,會引發錯誤,但訪問時經常會引發錯誤。

爲什麼我從地圖中獲取隨機狀態,當我處於完全有效的狀態?

+0

您可能正試圖從地圖上讀取不存在的董事會ID。在這種情況下'operator []'的行爲是插入一個默認構造的Board並返回它。嘗試使用'find'代替 –

+0

'auto choice = choices [board.getId()];'如果密鑰不存在,可以將項目添加到地圖。你也可以考慮在那裏使用'find'。 –

+0

我已驗證該ID在我訪問它之前已經在地圖中。將其添加到說明中。 –

回答

1

根據所提供的代碼和OP的正確性斷言,問題必須出現在Board的複製或賦值操作符中。請注意,「自動選擇」將選擇右側的副本。看起來很奇怪,你不使用一個const引用

const auto& choice = choices[board.getId()]; 

並採取在checkGoodMove相同的方式參數。

或者,checkGoodMove中的代碼有問題。