2010-05-14 98 views
4

我構建了一張地圖並加載了數據。如果我遍歷所有我看到的元素,它們都是有效的。但是,find方法找不到我的項目。我相信這是我正在做的一些愚蠢的事情。下面是摘錄:C++ STL map.find()找不到我的東西

// definitions 
// I am inserting a person class and using the firstname as the key 

typedef std::map<char*,Person *> mapType; 
mapType _myMap; 
mapType::iterator _mapIter; 


... 

Person *pers = new Person(FirstName, LastName, Address, Phone); 
_myMap.insert(make_pair(pers->firstName, pers); 

... 

...後來....

_mapIter = _myMap.find(firstName); // returns map.end 
_mapIter = _myMap.find("joe"); // returns map.end 

,我不知道爲什麼:(

+0

什麼'FirstName'持有?它和'firstName'是同一個變量嗎? C++區分大小寫。 – 2010-05-14 13:12:08

回答

14

由於關鍵是char*,他們將通過比較地址,而不是數值,例如

char* a = "123"; 
char* b = new char[4]; 
memcpy(b, a, 4); 
assert(a != b); 

您應該使用std::string,它有一個超值的<用於比較價值。

typedef std::map<std::string, Person*> mapType; 
... 

(也許你想使用Personshared_ptr<Person>的值,以避免內存泄漏。)

+1

我......我是個白癡....謝謝Kenny!它工作正常與std :: string – Joe 2010-05-14 13:32:02

+1

該鍵不應該是const(如果你的意思是'const string')。地圖會自動使其成爲const。如果你的意思是使用'char *'作爲鍵,那麼是的,地圖會使指針成爲常量,但是你仍然可以修改字符串本身,從而把所有東西都吹起來。 – UncleBens 2010-05-14 15:26:30

2

的替代KennyTM的解決方案(的std :: string,這實在是更好的解決方案)是告訴地圖它需要使用strcmp(),而不是<。但是,strcmp()的返回值不是std::map所期望的,它需要一個布爾值。所以你需要一個薄包裝功能:return strcmp(a,b) < 0;