[英]C++ STL map.find() not finding my stuff
我构建了一个地图并用数据加载它。 如果我遍历所有元素,我看到它们都是有效的。 但是,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
我不明白为什么:(
由于密钥是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>
作为值来避免内存泄漏。)
KennyTM的解决方案(std :: string,这是更好的解决方案)的替代方法是告诉map它需要使用strcmp()
,而不是<
。 但是, strcmp()
的返回值不是std::map
期望的,它需要一个布尔值。 所以你需要一个瘦的包装函数: return strcmp(a,b) < 0;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.