私はこれまでハッシュアルゴリズムを学んだことがなかったし、std :: unordered_mapを使うとハッシュ関数(実際には)は文字列ではなくメモリアドレスをハッシュしていることがわかった。私が間違っている場合は私を修正してください。しかし、未処理の文字列を変更してunordered_mapに追加するだけで、メモリアドレス(ポインタ)が同じであれば何も追加しませんでした。C++文字列のハッシュが文字列またはメモリアドレスをハッシュしますか?
とstd :: stringは別の領域のメモリのかに再割り当てするかどうかに依存して新しいキーが追加されているかどうか、以下の場合:直接でのstd ::文字列を使用している場合しかし、
std::unordered_map<const char*, char*> myMap;
std::string myString = "Key1";
myMap[myString.c_str()] = "someVal"; // <--- Adds a new key, size is now 1
myString = "Key2";
myMap[myString.c_str()] = "someVal"; // <--- Doesn't add a new key "Key2" didn't need to be reallocated
テンプレートを変更すると、別のキーをマップに追加するので、unordered_mapテンプレートはstd :: stringに特化していて、実際には文字列自体をハッシュすることになります。それは文字列自体をハッシュする必要がある場合、この方法は遅いですか?
私がこれを持ってきた理由は、私が見たチュートリアルが、それがハッシュされる実際の文字列そのものであるという意味を伝えているようだということです。ここでもスタックオーバーフローについては、パフォーマンス上の理由から「文字列全体をチェックする必要はなく、必要なだけ多くの文字をどうやって言い換えるか」という言い方を人々は見てきました。
私が得た印象は、文字列リテラルや文字列へのポインタでは間違っていますが、std :: stringクラスでは間違っていますか?
'char *'は文字列ではありません。 – juanchopanza