开发者

C++ STL map.find() not finding my stuff

开发者 https://www.devze.com 2022-12-30 12:23 出处:网络
I have constructed a map and loaded it with data. If I iterate over all the elements I see they are all valid. However, the find method doesn\'t find my item. I\'m sure it\'s something stupid I am doi

I have constructed a map and loaded it with data. If I iterate over all the elements I see they are all valid. However, the find method doesn't find my item. I'm sure it's something stupid I am doing. Here is snippet:

// 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

and I have no id开发者_StackOverflowea why :(


Since the key is char*, they will be compared by address, not by value, e.g.

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

You should use a std::string, which has an overloaded < for comparison by value.

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

(And probably you want to use a Person or shared_ptr<Person> as the value to avoid memory leak.)


The alternative to KennyTM's solution (std::string, which is really the better solution) is to tell map that it needs to use strcmp(), not <. However, the return value of strcmp() isn't what std::map expects, it wants a boolean. So you need a thin wrapper function : return strcmp(a,b) < 0;

0

精彩评论

暂无评论...
验证码 换一张
取 消