2010-11-08 52 views
3

在我的程序中的地圖檢索,我有一個字符串鍵和列表值(用戶定義的類)的地圖,像這樣定義的:問題從名單

std::map<const char*, std::list<Show>> _shows; 

我有一個功能,增加了具體的名單,像這樣:

void Add(Show s, const char* index) { 
list<Show> lshow = _shows[index]; 
lshow.push_back(s); } 

然而,每一次函數調用相同的索引,而不是返回相同的列表,我得到一個空列表。

我在做什麼錯?

ETA:我看到每次我調用函數後,字典中值的數量都會增加。這可能是[]運營商相關?

回答

6

地圖中的鍵是指針值,而不是其內容。所以怪異的行爲。更改地圖,使其密鑰爲std::string。此外,您修改您的存儲列表的副本。爲了避免這種情況,使用參考

list<Show>& ls = map[index] 
1

你需要使用一個參考:

list<Show>& lshow = _shows[index]; 

由於否則你創建一個臨時副本並添加到它。

由於每次搜索不同的指針,即使它指向相同的值,您也會看到地圖中的項目數量增加。如果您使用的是operator[],則此操作會添加一個空值。

您需要比較實際值(通過定義傳遞給映射構造函數的比較器)或使用std::string作爲鍵。

0

當您編寫list<Show> lshow = _shows[index]時,您實際上正在製作地圖中找到的列表的副本。你想要的是這個清單上的參考:list<Show> &lshow = _shows[index]

1

您正在使用const char *作爲std :: map鍵。地圖按指針地址排序,而不是指向字符串。要獲得您想要的行爲,請使用:

std::map<std::string,std::list<Show> > 
+0

還要確保你正在編輯存儲在地圖中的列表,而不是其它人的副本,正如其他人所說的:) – 2010-11-08 12:54:04

0

lshow_shows[index]副本。嘗試_shows[index].push_back(s),否則採取_shows[index]作爲參考

std::list<Show> &lshow = _shows[index]; 
lshow.push_back(s); 

也可以考慮重新命名_shows因爲名稱以下劃線通常被保留,標準庫。