Boost unordered_map работает только для связывания элементов с целыми числами? - PullRequest
0 голосов
/ 18 января 2010

у меня было

HashMap<Node, Double> 

в Java, который я использовал бы позже для получения двойного, связанного с узлом. Я пытался сделать

boost::unordered_map<Node*, double> 

но я получаю "ошибку C2108: индекс не имеет целочисленный тип", когда я пытаюсь вставить в него что-то вроде:

map[some_node] = some_double;

Если я правильно истолковал ошибку, я должен заменить свой double на int. Есть ли простой способ обойти это?

хорошо, тогда вот функция:

void myClass::someFunction(const double* r)
{
    //map is boost::unordered_map<Node*, double> 
    //nodes is a pointer to std::vector<Node*>
    std::vector<Node*>::iterator it;
    for(it = nodes->begin(); it != nodes->end(); it++)
    {
        //calculate the index
        map[*it] = r[index]; //error
    }
}

Ответы [ 4 ]

1 голос
/ 18 января 2010

В отличие от Java, C ++ не предоставляет хеш-функции для классов. Если тип ключа hashmap представляет собой целое число или указатель, то C ++ может использовать тот факт, что целое число является его собственным хэшем, но он не может это сделать для типов, которые вы определяете сами - в этом случае вы должны предоставить хеш функционировать явно. Это может быть трудно сделать эффективно, что является одной из причин того, что хеши были исключены из исходного стандарта C ++ в пользу карт, которые используют древовидную структуру, а не хеш-таблицу, и требуют только определения оператора <(), который обычно гораздо проще написать, чем эффективную хэш-функцию. </p>

Я бы также заметил, что если вы используете указатель на узел в качестве хеш-ключа, может быть проще и быстрее сохранить двойное значение в самом узле, чем использовать хеш-таблицу, как вы уже эффективно сделали узел, который вы хотите передать.

1 голос
/ 18 января 2010

Ошибка не для доступа к карте, а для r[index]. index должен быть целочисленным типом.

0 голосов
/ 18 января 2010

Вы не даете объявление some_node, но получите эту ошибку, если some_node не является указателем. Двойник должен быть в порядке.

Так что вам может понадобиться что-то вроде этого:

Node some_node;
...
map[&some_node] = some_double; 
0 голосов
/ 18 января 2010

Он не жалуется на двойника, он жалуется на "some_node".

Какая ваша карта определена как конкретно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...