2014-04-15 75 views
1

我很想學習地圖結構,我試圖用一個,但似乎無法解決一個問題。基於變量鍵的返回類對象的C++地圖

我試圖代碼如下:

map<string, valuePair> translator; 

類valuePair僅有2個對象(字符串和數字)的組合。

林分配值提供給地圖

translator[currentWord] = valuePair(stateNo, "state"); 

凡currentWord是可變字符串,stateNo是int。

現在後來我想從地圖中找回valuePair數值,但似乎無法做到。 繼承人我的觀察窗口試圖訪問變量x的屏幕截圖。 http://i.imgur.com/m3MOgi2.png

這些都是我設法在網上找到的方式來返回價值,但沒有一個似乎工作。正如你可以看到地圖上的關鍵字「a」。我究竟做錯了什麼? [編輯]謝謝你們,我使用了你在評論中給出的提示,發現它實際上是按我期望的方式工作 - 翻譯器[「a」] .x打印出我需要的值。我什麼都沒有標記爲「正確答案」,雖然,我不知道該怎麼現在有了這個主題做:/

+0

VS中的調試器無法顯示此運算符返回的值。仍然以正確的方式使用地圖 –

+1

我寧願看到你的代碼,而不是你的調試堆棧。你可以發佈你遇到問題的代碼嗎? –

+0

嘗試使用'std :: cout'在'ValuePair'中打印一個字段的vlaue,看看它是否打印了一些東西。 –

回答

2

正如Jonathan Henson在評論中發佈的那樣,發佈代碼比調試器輸出更好。理想情況下,您需要一個能夠再現錯誤的最小示例。

基於調試器輸出,我想知道您是否遇到範圍問題 - 您正嘗試訪問定義範圍之外的地圖數據。儘管沒有看到源代碼,但沒有辦法知道。

下面是一個工作示例,它完全正確地執行您正在嘗試執行的操作。唯一的修改是我使用了一個struct valuePair和C++ 11初始化器列表。這不會影響地圖訪問代碼,但您可能需要打開C++ 11支持才能編譯它。

作爲第一步,請在調試器中檢查一下,看看是否會遇到同樣的問題。如果是這樣,你的問題是調試器或調試器設置,而不是你的代碼。

如果調試器適用於示例代碼(下面發佈),請逐漸將我的代碼轉換爲代碼(進行最少的更改,構建以及查看它是否仍然有效)。這是學習語言優點的一種非常有用的方法。

#include <iostream> 
#include <map> 
#include <string> 

using namespace std; 

struct valuePair 
{ 
int num; 
string str; 
}; 



int main() 
{ 
map<string, valuePair> translator; 
translator["a"] = {0,"bla"}; 
translator["b"] = {1, "alb"}; 
translator["c"] = {2, "lab"}; 
valuePair res = translator["c"]; 
cout << "c:" << res.num << "," << res.str << "\n"; 
res = translator.at("b"); 
cout << "b:" << res.num << "," << res.str << "\n"; 
res = translator.find("a")->second; 
cout << "a:" << res.num << "," << res.str << "\n"; 
return 0; 
} 
+0

不知道爲什麼你被低估了,但這正是我需要看到的 - 調試窗口沒有顯示價值,但這種表示法按預期工作,問題原來是其他地方。謝謝。 – vvolis

+0

我很驚訝人們在這個網站downvote的速度有多快。這可能是因爲我在代碼上發生了一個格式錯誤,並且有人在我花了45秒糾正它的時候低估了它。 – Spacemoose

-2

這對我的作品

#include <map> 
#include <sstream> 
#include <string> 


int main() 
{ 
    std::map<std::wstring, double> items; 

    items[L"0"] = 0.123; 
    items[L"1"] = 1.234; 
    items[L"2"] = 2.234; 
    items[L"3"] = 3.345; 
    items[L"4"] = 4.567; 


    for (int i = 0; i < 5; i++) 
    { 
    std::wstringstream oss; 
    oss << i; 

    std::wstring key = oss.str(); 
    double value = items[key]; 
    } 


    return 0; 
} 
2

如果你有一個std::map<K,V> m;您可以添加元素並使用m[k] = v;更改值。然而,operator[]是一個操作,它總是創建一個鍵/值對,如果您正在查找的鍵未包含在映射中。因此,當你有一個const引用或指針時,它是不允許的,例如const std::map<K,V>&

隨着std::map你總是要考慮的情況下,你正在尋找的關鍵實際上是不包含在地圖中!

要查找存儲在給定密鑰下的值,您必須使用std::map::findlink)。

實施例:

std::map<std::string,valuePair>::const_iterator it = translator.find(currentWord); 
if(it != translator.end()) { 
    // the map contains an element with this key 
    const valuePair& value = it->second; // this is the value 
} 
else { 
    // the map *does not* contain an element with this key 
} 

作爲評價std::map::atlink)提及的可以是用於C++ 11的替代方案。但是,當你使用地圖中不存在的鍵時,必須注意可能發生的異常。

+0

我寧願[at](http://en.cppreference.com/w/cpp/container/map/at)。以及它是C++ 11,但我們已經在2014年。 – luk32

+0

@ luk32:這是一種替代方法,但是必須處理異常,或者確保您擁有有效的密鑰。 – Danvil

+0

國際海事組織,它更容易理解嘗試'在'和捕捉'std :: out_of_range'比引入迭代器。但這是一個品味問題。這只是我認爲我更喜歡例外。它們的行爲完全相同。「at」可能是用find來實現的,反之亦然。 – luk32