Я пытаюсь понять библиотеку Google Sparsehash. Следуя примеру http://goog-sparsehash.sourceforge.net/doc/sparse_hash_map.html, он скомпилирован и работал хорошо.
Однако, когда я начал меняться, я смутился. Я изменил пример на:
#include <iostream>
#include <sparsehash/sparse_hash_map>
using google::sparse_hash_map; // namespace where class lives by default
using std::cout;
using std::hash; // or __gnu_cxx::hash, or maybe tr1::hash, depending on your OS
using namespace std;
struct eqstr
{
bool operator()(const char* s1, const char* s2) const
{
return (s1 == s2) || (s1 && s2 && strcmp(s1, s2) == 0);
}
};
int main()
{
sparse_hash_map<const char*, int, hash<const char*> > months;
char april[] = "april";
months["january"] = 31;
months["february"] = 28;
months["march"] = 31;
months[april] = 30;
months["may"] = 31;
months["june"] = 30;
months["july"] = 31;
months["august"] = 31;
months["september"] = 30;
months["october"] = 31;
months["november"] = 30;
months["december"] = 31;
cout << "april -> " << months[april] << endl;
april[0] = 'd';
cout << april << endl;
cout << "dpril -> " << months[april] << endl;
cout << "count dpril: " << months.count(april) << endl;
и результаты:
april -> 30
dpril
dpril -> 30
count dpril: 1
Я не уверен, что понимаю это правильно. Когда я изменил букву в переменной april
, она не должна была найти ее в качестве ключа. Счет должен был быть 0. Если я сделаю
cout << "april -> " << months["april"] << endl;
Результат равен april → 0
, хотя "april"
находится на карте.
Имею ли я совершенно неправильное понимание хэш-карт? Мне кажется, что вместо использования значения "april"
он использует адрес памяти переменной april
при вставке и поиске.
Будут оценены любые разъяснения.
Спасибо!
Когда вы объявляете хэш-карту, вы говорите, что ключ - это указатель, а не строка или что-то еще, на что указывает указатель. Таким образом, вы можете на самом деле изменить содержимое массива april
на все, что хотите, поскольку это указатель на april
который является ключом.
Затем, когда вы используете строковый литерал "april"
качестве ключа, он указывает на этот литерал, который добавляется как новый ключ.