[]
演算子はリファレンスまたは参照参照を返します。そのため、そこにはコピーがありません。イテレータはstd::pair<std::string, std::string>
への参照を与えますので、そこにはコピーはありません。
std::string &map_entry = X["abc"]; // Reference to value, no copy
std::string *map_entry = &X["abc"]; // If you need a pointer
あなたが本当に&map["key"]
か&iterator->second
有効であることを、ポインタを必要とする場合。
パフォーマンスを探している場合、特にキーが非常に短い場合は、std::string
をキーとして回避するか、少なくとも注意してください。
は確かに順序付けられていないマップがstd::unordered_map<std::string, T>
はほぼ同じ速整数キーを言う使用などで、そのさらにわずか両方もなりにもかかわらず、通常の配列(可能性が密な整数キーからということO(1)
であるという理由だけだと思ういけませんO(1)
)。
一時的にstd::string
にする必要があります。最悪の場合、これは動的メモリ割り当てです。小さな文字列の場合、標準ライブラリの実装では "小さな文字列の最適化"があるかもしれませんが、それでもコピーはあります。
可能であれば、既存のstd::string
を使用したいと考えています。
ハッシュ(デフォルトはstd::hash
を使用)を計算し、文字列の長さがO(n)
の文字列に対して計算する必要があります。
std::string
は、そのハッシュをキャッシュする方法がないため、再利用(例:定数/静的)を避けることはできません。ただし、独自の文字列ラッパーを作成することもできます。ハッシュが衝突する可能性があるためunordered_map
エントリが見つからない場合
は、それは、ちょうどすべてがより速くなるでそう実際には何も見つからない(文字列の長さで再びO(n)
である場合、には、とにかく完全な文字列の比較を行う必要があります正しいことを見つけること)。整数または他の小さな固定サイズのキーを言う使用
なります(あなたの文字列が4つのまたは8バイトを言うよりも常に小さいことを知っている場合も考慮し、あなただけの「ヌルパディング」との整数であること作ることができます)ハッシュは数学の単純な部分であり、比較は単一の操作である。
高密度整数(たとえば、列挙型0〜16)を使用すると、配列と配列の索引付けを使用できるようになります。非常に高速です。
コピーを作成する必要があると思われる理由が明確ではありません。 'operator []'は、コピーではなく参照を返します。 – user463035818
イテレータを間接参照すると参照が返されるので、そこにコピーはありません。 – Jarod42
関連性がありません:コピーを避ける必要がある場合は、不要なヘッドスペースを安全にするためのポインタではなく参照を使用してください – user463035818