2011-08-14 53 views
0

我一直有這個問題一段時間與我的代碼,尋找我的錯誤,我看不到它。我有一張地圖,我將映射關鍵字映射到值。
我的問題是有時插入關鍵字=「藍色」的值插入到「紅色」的關鍵。
所以不是,
關鍵:紅色,值:OBJ1,OBJ2
重點:藍色,值:OBJ 3,OBJ4
我得到的,
關鍵:紅色,值:OBJ1,OBJ2,OBJ4(OBJ4應鍵入藍色)
關鍵:藍色,值:obj3將鍵值插入錯誤鍵?

不確定它是什麼,因爲相同版本的代碼適用於我擁有的其他地圖,它們只是沒有儘可能多的Keys。

addKeywordsForObject(const Object* const object, int nKeywords, ...) 
{ 
va_list  keywords; 
char  *keyword; 

va_start(keywords, nKeywords); 
for (int i = 0; i < nKeywords; i++) { 
    keyword = va_arg(keywords, char*); 

    if(objectToKeywordMap.find(keyword) == objectToKeywordMap.end()) { 
     keywordObject = new ObjectSet(); 
     keywordObject->insert(const_cast<Object* const>(object)); 
     objectToKeywordMap.emplace(StringToObjectSetMap::value_type(keyword,keywordObject)); 
    } 
    else { 
     keywordObject->insert(const_cast<Object* const>(object)); 
     objectToKeywordMap.emplace(StringToObjectSetMap::value_type(keyword,keywordObject)); 
    } 
} 
va_end(keywords); 
} 
+0

顯示在哪裏,這些參數的數量char *指針從哪裏來,你如何創建它們?看起來你不知道地圖中的鍵是指針,而不是字符串,地圖不會像字符串那樣比較它們。 – hamstergene

+1

您不顯示密鑰如何存儲在地圖中。 'std :: string'和'char *'之間會有很大的區別!一個常見的問題是比較指針而不是字符串值。 –

+0

猜猜我已經離開了。密鑰存儲爲字符串。該映射是map 。我曾嘗試使用tempString在地圖中使用它之前將char *關鍵字存儲爲字符串,但它沒有效果。 – Phillip

回答

0

我沒有看到keywordObject的聲明,所以我認爲這是一個全球性的。向已經存在的關鍵字添加新對象的情況在else中處理。在這種情況下,keywordObject的價值是多少?誰設置它?

此代碼還有其他一些問題,其他一些問題在其他答案和評論中提到。

  • addKeywordsForObject
  • char*可能的使用作爲地圖的關鍵,需要特殊處理(不明確的,因爲你並沒有顯示出StringToObjectSetMap的聲明),它採用可變
  • 功能缺失的返回類型通過使用省略號(幾乎從來沒有一個好主意,在C++)
  • 使用全局變量的其中一個局部變量是合適的
+0

無返回類型,它是一個void函數。 map key是字符串,map 程序是一個來自java的端口,它使用可變參數作爲關鍵字,所以這就是爲什麼這是可變參數 – Phillip

+0

'keywordObject'在頭文件'ObjectSet * keywordObject'中聲明。看起來好像沒有在'else'中設置'keywordObject'就是問題所在。'keywordObject = objectToKeywordMap.find(keyword) - > second;' – Phillip

+0

@Phillip您還需要爲void函數設置返回類型。解決其他問題也是一個好主意。 – ymett

0

最有可能的問題是,你還沒有定義排序功能的key type是您的地圖了。你需要「告訴」地圖如何將指數型

排序例如:

struct sortKey{ 
bool operator()(key_type const& k1, key_type const& k2){ 
//define your sort criteria here 
} 

} 
std::map<key_type,value_type,sortKey> the_map; 

請評論,如果您覺得有別的,你失去了一些東西。

+0

我沒有實現,但也許這是我應該做的。 – Phillip

+0

是的。否則你不知道地圖將如何保持值。 –