81

次の 2 行の違いは何ですか?

map<int, float> map_data;
map<const int, float> map_data;
4

7 に答える 7

69
  • intconst 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もうまくいきません。

于 2013-07-14T13:20:57.557 に答える
36

キーはすでにであるため、この場合constは冗長constです。要素が入力されると、その要素をkey変更することはできません。


編集

コメントで述べたように、2 つの行に違いがあります。たとえば、 を受け入れる関数を作成した場合、型が異なるmap<const int, int>ため渡すことができません。map<int, int>

ただし、それらは異なるタイプですが、マップのキーはconstとにかく...であるため、同じように動作することに注意してください...

結論として..唯一の違いは、それらが 2 つの異なるタイプであることです。他のことは気にする必要はありません。

于 2013-07-14T09:31:52.853 に答える
3

const一度設定すると変更できません。keyはい、ドキュメントとその他の回答に従って、それはconstすでに覚えておく必要があります。

リンク: http://www.cplusplus.com/reference/map/map/ リンク: http://en.cppreference.com/w/cpp/container/map

于 2013-07-14T09:40:44.577 に答える
0

キーがポインターの場合、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;
}
于 2014-02-16T16:38:46.970 に答える
-1

const は、一度定義すると変更できない定数を指します... 非 const キーは変更される可能性があります... または変更することさえできません。const で「変更なし」が保証されているだけです (一度定義すると)。 、および「変更」は、非 const のもので発生する場合と発生しない場合があります。

于 2013-07-14T15:02:34.057 に答える