2012-01-19 3 views
-1

質問が奇妙に聞こえるかもしれませんが、unordered_mapがあるstd :: stringキー最大サイズは8 + 1(ヌル終了の場合は1)です。std :: stringとun nullered_map :: nullのためのnullで終わる可能性のある文字配列の間のカスタムコンパレータ

私はchar(8)変数の文字列を受け取りました。これは、find()呼び出しのためだけにstrcpyをtemp std :: stringにしたくないということです。

何かコンパイラを実装する方法があるので、find()呼び出しでchar [8]を直接使用できますか?

char [8]には "12345678"(ヌル終了なし)が含まれている可能性があるので、デフォルトのstrcmpはおそらく動作しません。

+3

64ビットマシンでは、1回の移動で8つの文字をコピーします。どのくらいあなた(マイクロ)がこれを最適化しますか? –

+0

正しい。 'strncmp(lhs.data()、rhs、8)'はあなたが使いたい基本的なものです。 –

+0

boost :: unordered_mapを使用していますか? –

答えて

1

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

+0

おそらく述語を比較したくないことに注意してください。つまり、 'operator ==()'をオーバーロードするのではなく、関数呼び出し演算子 'operator()()'をオーバーロードしたいとします。おそらく、メンバ関数は 'const'でなければなりません。それは、私はこれがうまくいくとは思わないと言いました... –

2

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

プロファイリングで実際にパフォーマンス上の問題が発生した場合は、単純な固定サイズの定数文字列クラスを作成し、これを関連コンテナのキーとして使用することになります。実際に必要な操作は、 。

関連する問題