-1

質問が奇妙に聞こえるかもしれませんが、std::string キーが最大サイズ 8+1 (null 終了の場合は 1) である unordered_map があるレガシー コードがいくつかあります。

find() 呼び出しのためだけに一時的な std::string に strcpy したくない char[8] 変数で文字列を受け取っています。

find() 呼び出しで直接 char[8] を使用できるように、何らかのコンパレータを実装する方法はありますか?

char[8] には "12345678" (null 終端なし) のようなものが含まれている可能性があるため、デフォルトの strcmp はおそらく機能しませんが、strncmp は機能しますか?

4

2 に答える 2

2

マップ タイプが のキー タイプを使用する場合、(23.4.4.1 パラグラフ 2 の署名を参照) または(23.5.4.1 パラグラフ 3 の署名を参照)を使用するかどうかに関係なく、std::stringの構築を避けることはできません。への引数は. null で終了していない C 文字列をこれに渡そうとすると、おかしな動作が発生します。個人的には、おそらく配列から作成し、使用されている Small String Optimization に依存するヘルパー関数を作成します(つまり、メモリが割り当てられるのではなく、文字がコピーされるだけです)。std::stringstd::map<std::string, T>std::unordered_map<std::string, T>find()key_type const&std::stringchar

プロファイリングでこれが実際にパフォーマンスの問題であることがわかった場合は、おそらく単純な固定サイズの定数文字列クラスを作成し、これを連想コンテナーのキーとして使用します。これが実際に必要とするいくつかの操作は、実装するのがそれほど難しくありません。

于 2012-01-19T23:57:01.267 に答える
1

とパラメータoperator==の各組み合わせを使用して、の複数のオーバーロードを持つコンパレータ クラスを作成します。文字列に対してメソッドを使用し、と比較します。char*const string&c_str()strncmp

于 2012-01-19T23:27:55.690 に答える