Pertanyaan C ++ STL map.find () tidak menemukan barang-barang saya


Saya telah membuat peta dan memuatnya dengan data. Jika saya mengulangi semua elemen yang saya lihat semuanya valid. Namun, metode find tidak menemukan item saya. Saya yakin itu adalah sesuatu yang bodoh yang saya lakukan. Berikut ini cuplikan:

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

...

...kemudian....

_mapIter = _myMap.find(firstName); // returns map.end
_mapIter = _myMap.find("joe"); // returns map.end

dan saya tidak tahu mengapa :(


4
2018-05-14 13:10


asal


Jawaban:


Karena kuncinya adalah char*, mereka akan dibandingkan berdasarkan alamat, bukan berdasarkan nilai, mis.

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

Anda harus menggunakan std::string, yang memiliki kelebihan beban < untuk perbandingan berdasarkan nilai.

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

(Dan mungkin Anda ingin menggunakan Person atau shared_ptr<Person> sebagai nilai untuk menghindari kebocoran memori.)


14
2018-05-14 13:14



Alternatif untuk solusi Kenny (std :: string, yang benar-benar solusi yang lebih baik) adalah untuk memberitahu peta yang perlu digunakan strcmp()tidak <. Namun, nilai kembalinya strcmp()  bukan apa std::map mengharapkan, ia menginginkan boolean. Jadi Anda membutuhkan fungsi pembungkus tipis: return strcmp(a,b) < 0;


2
2018-05-14 13:26