Google Sparsehash - понимание ключей

0

Я пытаюсь понять библиотеку 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 при вставке и поиске.

Будут оценены любые разъяснения.

Спасибо!

Теги:
hashmap

1 ответ

0
Лучший ответ

Когда вы объявляете хэш-карту, вы говорите, что ключ - это указатель, а не строка или что-то еще, на что указывает указатель. Таким образом, вы можете на самом деле изменить содержимое массива april на все, что хотите, поскольку это указатель на april который является ключом.

Затем, когда вы используете строковый литерал "april" качестве ключа, он указывает на этот литерал, который добавляется как новый ключ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню