8

私が理解していることから、 std::map の値ペアのキーは、一度挿入すると変更できません。これは、キー テンプレート引数を const としてマップを作成しても効果がないということですか?

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

4 に答える 4

13

タイトルの質問への答えはイエスです。違いがあります。std::map<int, int>を取る関数にa を渡すことはできませんstd::map<const int, int>

ただし、マップのタイプは異なりますが、マップの機能的な動作は同じです。これは珍しいことではありません。多くのコンテキストでは、int と long は形式的には異なる型ですが、同じように動作します。

于 2009-08-11T14:39:49.083 に答える
1

std::mapとにかく、そのキータイプを構成します: std::map<int, int>::value_typeis std::pair<const int, int>. constキー タイプにa を追加すると、const const int単純に に折りたたまれconst intます。

于 2009-08-11T14:15:55.270 に答える
1

int は値によってコピーされるため、この const の宣言は意味がありません。一方、

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

イメージを劇的に変える

于 2009-08-11T11:44:47.713 に答える
0

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 
于 2009-08-11T12:13:18.017 に答える