Есть ли разница между std :: map <int, int> и std :: map <const int, int>? - PullRequest
8 голосов
/ 11 августа 2009

Насколько я понимаю, ключ в паре значений в std :: map нельзя изменить после вставки. Означает ли это, что создание карты с аргументом шаблона ключа как const не имеет никакого эффекта?

std::map<int, int> map1;
std::map<const int, int> map2;

Ответы [ 4 ]

13 голосов
/ 11 августа 2009

Ответ на ваш заглавный вопрос - да. Есть разница. Вы не можете передать std::map<int, int> функции, которая принимает std::map<const int, int>.

Однако функциональное поведение карт идентично, даже если они разных типов. Это не необычно. Во многих случаях int и long ведут себя одинаково, хотя формально это разные типы.

1 голос
/ 11 августа 2009

std::map в любом случае соответствует типу ключа: std::map<int, int>::value_type равно std::pair<const int, int>. Если вы добавите const к типу ключа, const const int просто свернется до const int.

1 голос
/ 11 августа 2009

, поскольку int копируется по значению, это объявление const не имеет смысла. С другой стороны

std::map<const char*, int> map2; 

резко меняет картинку

0 голосов
/ 11 августа 2009

Как сказал Дьюфи, с приведенным вами примером, это не имеет значения, поскольку int является встроенным типом и будет копироваться по значению, но с char * это немного отличается ...

Если бы у вас было

std::map<char *, int> map;

Тогда вы не можете вставить переменную, объявленную как const char *, произойдет сбой

char * y = new char[4];
const char * x = "asdf";
std::map<char *, int> map;
map.insert(make_pair(y, 4)); //ok
map.insert(make_pair(x, 4)); //fail

с

std::map<char*, int> map;

Вы действительно можете сказать

char * x = new char[1];
(*x) = 'a';
map<char*,int>::iterator it = map.begin();
cout<<it->first; //prints 'a'
(it->first)[0] = 'x'
cout<<it->first; //prints 'x'

с

 std::map<const char *, int>

вы будете ограничены использованием

 map<const char*, int>::iterator 
...