C ++ STL map.find()找不到我的东西

时间:2010-05-14 13:10:47

标签: c++ stl map find

我构建了一个地图并用数据加载了它。如果我遍历所有元素,我看到它们都是有效的。但是,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

我不明白为什么:(

2 个答案:

答案 0 :(得分: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 :(得分:2)

KennyTM解决方案的替代方案(std :: string,这是更好的解决方案)是告诉地图它需要使用strcmp(),而不是<。但是,strcmp()的返回值不是std::map所期望的,它需要一个布尔值。所以你需要一个瘦的包装函数:return strcmp(a,b) < 0;