次の 2 行の違いは何ですか?
map<int, float> map_data;
map<const int, float> map_data;
次の 2 行の違いは何ですか?
map<int, float> map_data;
map<const int, float> map_data;
int
とconst int
は 2 つの異なるタイプです。
std::map<int, float>
とstd::map<const int, float>
は、同様に異なるタイプです。
std::map<const int, float>
との違いstd::map<int, float>
は、ある程度、 と の違いに似ていstd::map<int, float>
ますstd::map<std::string, float>
。それぞれに新しいマップ タイプを取得します。
そうでないconst
場合、内部鍵のタイプはまだ non-const
int
です。
std::map<const int, float>::key_type => const int
std::map<int, float>::key_type => int
ただし、マップ キーは意味的に不変であり、キーへの直接アクセスを許可するすべてのマップ操作 (たとえば、 を生成するイテレータの逆参照value_type
) はをconst
修飾しkey_type
ます。
std::map<const int, float>::value_type => std::pair<const int, float>
std::map<int, float>::value_type => std::pair<const int, float>
したがって、実装が許可されている場合、重要なすべての点で違いがほとんど見えない可能性があります。
ただし、常にそうであるとは限りません。標準では、キーの型がコピー可能で移動可能であることを正式に要求しており、一部の実装ではマップ ノードを再利用します。これらの実装では、キーを使用しようとしてconst
もうまくいきません。
キーはすでにであるため、この場合const
は冗長const
です。要素が入力されると、その要素をkey
変更することはできません。
コメントで述べたように、2 つの行には違いがあります。たとえば、 を受け入れる関数を作成した場合、型が異なるmap<const int, int>
ため渡すことができません。map<int, int>
ただし、それらは異なるタイプですが、マップのキーはconst
とにかく...であるため、同じように動作することに注意してください...
結論として..唯一の違いは、それらが 2 つの異なるタイプであることです。他のことは気にする必要はありません。
const
一度設定すると変更できません。key
はい、ドキュメントとその他の回答に従って、それはconst
すでに覚えておく必要があります。
リンク: http://www.cplusplus.com/reference/map/map/ リンク: http://en.cppreference.com/w/cpp/container/map
キーがポインターの場合、const キーが役立ちます。const キーを使用すると、キーにアクセスするときに指定されたオブジェクトを変更できなくなります。次の点を考慮してください。
#include <map>
#include <string>
int glob = 10;
int main() {
std::map<const int*, std::string> constKeyMap { { &glob, "foo"} };
std::map<int*, std::string> keyMap { { &glob, "bar" } };
for(const auto& kv : keyMap) { *(kv.first) = 20; }; // glob = 20
for(const auto& kv : constKeyMap) { *(kv.first) = 20; }; // COMPILE ERROR
return 0;
}
const は、一度定義すると変更できない定数を指します... 非 const キーは変更される可能性があります... または変更することさえできません。const で「変更なし」が保証されているだけです (一度定義すると)。 、および「変更」は、非 const のもので発生する場合と発生しない場合があります。