C 文字列をマップ キーとして使用することに問題はありますか?
std::map<const char*, int> imap;
マップ内の要素の順序は重要ではないため、 を使用して順序付けされていれば問題ありませんstd::less<const char*>
。
私は Visual Studio を使用しており、MSDN (Microsoft 固有) によると:
場合によっては、同一の文字列リテラルを「プール」して、実行可能ファイルのスペースを節約できます。文字列リテラル プーリングでは、コンパイラは、各参照が文字列リテラルの個別のインスタンスを指すのではなく、特定の文字列リテラルへのすべての参照がメモリ内の同じ場所を指すようにします。
一部のケースでのみプールされると書かれているため、文字列リテラルを使用してマップ要素にアクセスするのは悪い考えのようです:
//Could these be referring to different map elements?
int i = imap["hello"];
int j = imap["hello"];
マップ要素が等しいかどうかを判断するためにポインター値ではなく実際の C 文字列が使用されるように、operator==
オーバーロードすることは可能ですか?const char*
bool operator==(const char* a, const char* b)
{
return strcmp(a, b) == 0 ? true : false;
}
C文字列をマップキーとして使用することは良い考えですか?