私が理解していることから、 std::map の値ペアのキーは、一度挿入すると変更できません。これは、キー テンプレート引数を const としてマップを作成しても効果がないということですか?
std::map<int, int> map1;
std::map<const int, int> map2;
タイトルの質問への答えはイエスです。違いがあります。std::map<int, int>
を取る関数にa を渡すことはできませんstd::map<const int, int>
。
ただし、マップのタイプは異なりますが、マップの機能的な動作は同じです。これは珍しいことではありません。多くのコンテキストでは、int と long は形式的には異なる型ですが、同じように動作します。
std::map
とにかく、そのキータイプを構成します: std::map<int, int>::value_type
is std::pair<const int, int>
. const
キー タイプにa を追加すると、const const int
単純に に折りたたまれconst int
ます。
int は値によってコピーされるため、この const の宣言は意味がありません。一方、
std::map<const char*, int> map2;
イメージを劇的に変える
Dewfyが言ったように、あなたが与えた例では、 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