2009-08-11 5 views
8

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

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

ответ

13

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

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

+2

Первый ответ, который фактически отвечает на вопрос. –

1

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

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

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

+1

В вашем примере не рассматривается вопрос: const char * - это непостоянный указатель на постоянный символ, в то время как вопрос касается создания константы типа (таким образом, постоянного указателя на непостоянный символ): std: : map

+0

Точка сообщения о смысле использования copy semantic, "const char *", скопированная значением, позволяет итерацию по ключу, но отключает модификацию ключа. Ваше заявление - это неудобство. - он отключает итерацию по ключу, но допускает модификацию: char * const v = "qwe"; * v = '6'; // разрешено !!! /*, но эта причина ошибки компилятора: v ++; */ символ * Const v - просто – Dewfy

0

Как сказала Dewfy, на примере вы дали, это не имеет значения, так как ИНТ встроенного типа и он будет скопирован по значению, но с гольца * это немного отличается ...

Если у вас

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

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

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 
+2

См комментарий к Dewfy: Const символ * не является постоянным указателем на постоянной полукокса. Вы не делаете тип константой, а скорее полностью меняете тип (чтобы указать на другой тип) –

1

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

Смежные вопросы