Хэш-карта векторов в C ++ - PullRequest
       5

Хэш-карта векторов в C ++

1 голос
/ 12 декабря 2011

Я хочу реализовать хэш-карту векторов в C ++.Вот мой код:

#include <cstdlib>
#include <string>
#include <iostream>
#include <vector>
using namespace std;

#include <ext/hash_map>
using namespace __gnu_cxx;

int main (int argc, char * const argv[]) {
    std::vector<int> v;
    hash_map<int, std::vector<int> > months;
    v.push_back(28);
    v.push_back(28);
    v.push_back(28);
    v.push_back(29);
    months["february"] = v; //error = invlalid conversion from const char* to int
    return 0;
}

Приведенный выше код не может быть скомпилирован.Ошибки включены рядом с соответствующими строками.Имеет ли это какое-либо отношение ко мне, оставляя значения для необязательных аргументов (хэш и сравнение)?

Ответы [ 6 ]

3 голосов
/ 12 декабря 2011

Вы указали тип ключа как int, но вы пытаетесь указать строковый литерал ...

3 голосов
/ 12 декабря 2011

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

hash_map<std::string, std::vector<int> > months;
1 голос
/ 12 декабря 2011

Отличается от 5 других ответов, которые все одинаковы.Есть фиксированное количество месяцев.Было бы ненужно хранить их в виде строки.enum может помочь вам обратиться к ним по имени.Это было бы намного более эффективно, но не до оптимизации, потому что это также имеет больше смысла.Опечатка типа "feburary" в строковой версии добавит новый месяц!Если бы это было enum, вы бы получили ошибку компиляции, плюс если ваш редактор использует автозаполнение, вам не придется искать, как пишется februrary.

enum { JANUARY=0, FEBRUARY,MARCH,APRIL,MAY,JUNE,JULY,AUGUST,SEPTEMBER,OCTOBER,NOVEMBER,DECEMBER};
months[FEBRUARY] = v; 

Вы можете поместить его в пространство имен, если не хотите загрязнять глобальное.И было бы легче сделать их строчными на этом этапе.

namespace Month {
enum { January=0, February,March,April,May,June,July,August,September,October,November,December};
}
months[Month::February] = v; // equivalent to months[1]=v if you prefer number

Вы также можете начать enum с 1, если хотите, чтобы январь был 1 вместо февраля.Это может иметь больше смысла для вас.Я думаю, что широкая публика должна относиться к январю как 0, но, возможно, это только я.0 можно изменить на NULL_MONTH или INVALID_MONTH, или на то, что подходит вашему дизайну.

1 голос
/ 12 декабря 2011

Проблема в том, что месяцы - это hash_map, ключом которого является int.в months["february"] вы передаете char const * Возможно, вы хотите использовать syd :: string в качестве ключа.

например hash_map<std::string, std::vector<int> > months;

1 голос
/ 12 декабря 2011
hash_map<int, std::vector<int> > months;

Ключом к этому hashmap является int, но вы пытаетесь вставить в него строку «февраль».

1 голос
/ 12 декабря 2011

Ключ int, и вы даете строку.Измените объявление на:

hash_map<std::string, std::vector<int> > months;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...