我构建了一个地图并用数据加载了它。如果我遍历所有元素,我看到它们都是有效的。但是,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 :(得分: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;
...
(可能您希望使用Person
或shared_ptr<Person>
作为值以避免内存泄漏。)
答案 1 :(得分:2)
KennyTM解决方案的替代方案(std :: string,这是更好的解决方案)是告诉地图它需要使用strcmp()
,而不是<
。但是,strcmp()
的返回值不是std::map
所期望的,它需要一个布尔值。所以你需要一个瘦的包装函数:return strcmp(a,b) < 0;