我已经构建了一个地图,并在其中加载了数据。如果我遍历所有元素,我会发现它们都是有效的。但是,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);
...
...later...
_mapIter = _myMap.find(firstName); // returns map.end
_mapIter = _myMap.find("joe"); // returns map.end
我不知道为什么:
发布于 2010-05-14 21:14:35
由于键是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>
作为值,以避免内存泄漏。)
发布于 2010-05-14 21:26:35
KennyTM的解决方案(std::string,这实际上是更好的解决方案)的替代方案是告诉map它需要使用strcmp()
,而不是<
。然而,strcmp()
的返回值并不是std::map
所期望的,它需要一个布尔值。因此您需要一个简单的包装器函数:return strcmp(a,b) < 0;
https://stackoverflow.com/questions/2834362
复制相似问题