Насколько я понимаю, ключ в паре значений в std::map не может быть изменен после вставки. Означает ли это, что создание карты с аргументом шаблона ключа как const не имеет никакого эффекта?
std::map<int, int> map1;
std::map<const int, int> map2;
Насколько я понимаю, ключ в паре значений в std::map не может быть изменен после вставки. Означает ли это, что создание карты с аргументом шаблона ключа как const не имеет никакого эффекта?
std::map<int, int> map1;
std::map<const int, int> map2;
Ответ на ваш вопрос в заголовке — да. Есть разница. Вы не можете передать std::map<int, int>
функции, которая принимает std::map<const int, int>
.
Однако функциональное поведение карт идентично, несмотря на то, что они относятся к разным типам. В этом нет ничего необычного. Во многих контекстах int и long ведут себя одинаково, хотя формально это разные типы.
поскольку int копируется по значению, это объявление const не имеет смысла. С другой стороны
std::map<const char*, int> map2;
резко меняет картину
std::map
в любом случае определяет свой тип ключа: std::map<int, int>::value_type
это std::pair<const int, int>
. Если вы добавите const
к типу ключа, const const int
просто свернется в const int
.
Как сказал Дьюфи, в приведенном вами примере это не имеет значения, поскольку 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