2015-05-07 1 views
0

Я хочу динамически выделять массив указателей на unordered_map в C++. Карта std :: unordered была typedef как «словарь».Доступ к значениям карты из ее ключа с помощью указателя на карту

dict_array= (dictionary **) calloc(input_size, sizeof(dictionary*)); 

Теперь я хочу, чтобы получить доступ к отдельным HashMaps, так и для каждого отдельного HashMap (mydict), я хочу, чтобы получить доступ к данным с помощью какой-то ключ. как показано ниже:

for (int i=0; i< input_size, i++){ 
    dictionary *mydict= dict_array[i]; 
    mydict[some_key]++; /*access the value against 'some_key' and increment it*/ 
} 

Но эта вышеприведенная строка для доступа к значению в отношении ключа генерирует ошибку компиляции. Каким будет правильный способ доступа к нему?

+0

Вы вы создаете указатели на стандартные контейнеры? – NathanOliver

+0

Почему вы используете 'calloc'? И любое упоминание о «динамических массивах» в C++ приведет к обязательному «почему вы не используете' std :: vector'? »? – PaulMcKenzie

ответ

1

В вашем примере вы фактически не размещали никаких dictionary или (std::unordered_map) объектов.

dict_array[i] - просто нулевой указатель. Таким образом, присваивание mydict также приводит к нулевому указателю. Вам нужно будет сначала построить dictionary, вызвав dict_array[i] = new dictionary();.

Выражение mydict[some_key]++ не означает, что вы думаете, это потому, что mydict является dictionary * и не dictionary. Таким образом, Вы должны были бы на самом деле разыменования его, прежде чем иметь доступ к действительному dictionary объекта:

(*my_dict)[some_key]++ 

Но опять-таки, прежде чем это будет работать, вы должны инициализировать основные указатели.

Кроме того, это, как правило, плохая идея (которая часто приводит к неопределенному поведению), чтобы смешивать выделение C с стандартными объектами C++.

1

Почему вы так возились с указателями?

Если вы действительно хотите, массив указателей, то вам придется разыменования, чтобы доступ к этой карте сама:

(*my_dict)[some_key]++; 

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

Или использовать менее безумную структуру данных

std::vector<dictionary> dict_array(input_size); 

dict_array[i][some_key]++;