2016-04-19 4 views
0

std::string(数十万エントリ)の巨大なSTLコンテナがあります。私は現時点でvectorを使用していますが、私は変更して嬉しいです。内容はアルファベット順にソートされ、アルファベットの小文字a-z ñで構成されています。注文したSTLコンテナ内の接頭辞で始まるすべての文字列(非ASCII文字以外)を検索します

const std::string& prefixを受け取り、そのような接頭辞で始まる最初の要素と最後の要素を指す最初の要素を指す1組の反復子を返す関数を実装しようとしています。条件に一致する文字列がない場合は、2つの同一イテレータを返します。ベクトルが膨大であるため、検索に効率が必要なので、バイナリ検索のためにそれを使用したいと考えています。

私が探しているのはstd::lower_boundだと思いますが、ñを扱うことができるstd::stringを比較する関数がありません。

+0

UTF-8を使用していますか?ベクタで使用するのと同じエンコーディングを検索接頭辞文字列に使用する限り、問題はないはずです。速度については、ラムダに接頭辞の長さを取り込み、 'std :: string :: compare'の適切なオーバーロードを呼び出すことができます。 – paddy

+0

'lower_bound()'に渡すカスタム比較関数を書くことができますが、 'ñ'はASCIIではないので、実行する比較はcharset/localeを考慮する必要があります。 'std :: string'は' char'値だけを知っていて、charset/localeの概念を持たないので、手動で扱う必要があります。 'ñ'は異なるcharsetの異なる' char'値になることがあり、いくつかの文字セットには全く存在しません。 –

答えて

1

std::equal_rangeで等しい値の全範囲を取得できます。コレクションに少なくとも1つの一致する文字列がある場合、範囲の終わりを過ぎて1つずつ、イテレータのペアを返します。文字列が存在しない場合は、その文字列が存在する場合にその位置に属する直後の最初の位置に2つの等しいイテレータを与えます。

同一の部分文字列を探すだけであれば、(最初のN文字の)通常の文字列比較がうまくいくはずです。入力文字列のペアのようなものをサポートしたい場合、それらの間のすべての入力を検索したいので、 "m *"から "o *"( "ñ*"文字列2つの間にあると扱われる)、少し好奇心を持たなければなりません(通常は、文字コードをインデックスとして、それぞれの位置の値として相対的な順序で照合テーブルを作成します)。

+0

接頭辞のマッチングはデフォルトの 'equal_range()'にすることができますか、それとも全長の比較のみですか?または、プレフィックスマッチングを実装するためにカスタム比較ファンクタが必要ですか? –

+0

@RemyLebeau:指定した比較の種類に関係なく、比較オブジェクトを渡すことができます。この場合、 'return a.substr(0、N)

+0

'return(a.compare(0、b.size()、b)== 0)のような不必要な割り当てを避けるために、代わりに' std :: string :: compare() 'オーバーロードの1つを使用します。 ' –

関連する問題