Есть ли разница между std::map‹int, int› и std::map‹const int, int›?

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

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

person Community    schedule 11.08.2009    source источник


Ответы (4)


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

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

person MSalters    schedule 11.08.2009
comment
Первый ответ, который действительно отвечает на вопрос. - person Tamás Szelei; 11.08.2009

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

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

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

person Dewfy    schedule 11.08.2009
comment
В вашем примере не рассматривается вопрос: const char* является непостоянным указателем на постоянный char, тогда как вопрос касается создания постоянного типа (таким образом, постоянный указатель на непостоянный char): std::map‹ char* константа, интервал › - person David Rodríguez - dribeas; 11.08.2009
comment
Точка сообщения о смысле использования семантики копирования, const char* копируется по значению, разрешает итерацию по ключу, но отключает модификацию ключа. Ваше заявление является своего рода неудобством. - отключает итерацию по ключу, но разрешает модификацию: char *const v = qwe; *v = '6';//разрешено!!! /*но это вызывает ошибку компилятора: v++;*/ char *const v - просто - person Dewfy; 11.08.2009

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

person sbi    schedule 11.08.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 
person Charles Ma    schedule 11.08.2009
comment
См. комментарий к Dewfy: const char* — непостоянный указатель на постоянный char. Вы не делаете тип постоянным, а полностью меняете тип (чтобы указать на другой тип) - person David Rodríguez - dribeas; 11.08.2009