0

C++ で lower_bound 関数を試しています。1 d データ型に複数回使用しました。

今、私はsorted array dict[5000][20]の文字列を見つけるためにそれを試していますsize <=20。照合する文字列はstr.

bool recurseSerialNum(char *name,int s,int l,char (*keypad)[3],string str,char (*dict)[20],int 
dictlen)

{


    char (*idx)[20]= lower_bound(&dict[0],&dict[0]+dictlen,str.c_str());

    int tmp=idx-dict;

    if(tmp!=dictlen)
        printf("%s\n",*idx);

}

http://www.cplusplus.com/reference/algorithm/lower_bound/?kw=lower_boundに従って、この関数は、一致が見つからない場合、つまりtmp等しい必要がある場合に「最後」(末尾を超えた) のインデックスを返すことになっていdictlenます。私の場合、それは常に開始インデックスを返します。つまり、tmp equal to 0両方を取得dictしますdict

問題は、ポインターの処理と受け渡しにあると思います。ベクターのdefault comparator場合と同様に、この場合も を使用できるはずです。また、明示的なものを渡そうとしましたが、役に立ちませんでした。

私はこのコンパレータを試しました -

bool compStr(const char *a, const char *b){
    return strcmp(a,b)<0;
}

ベクトルなどを使用することは知っていALTERNATEますが、これの問題を知りたいです。SOだけでなくGoogleでもこれを検索しましたが、似たようなものは見つかりませんでした。

4

1 に答える 1

2

ここには 2 つの誤解があると思います。

  1. std::lower_bound要素がソートされた範囲の一部であるかどうかはチェックしません。代わりに、順序を崩さずに要素を挿入できる左端の場所を見つけます。
  2. 文字列の内容ではなく、メモリアドレスを比較しています。

dict内部配列のメモリアドレスが昇順であるという意味で、あなたの場合はソートされた範囲であることは事実です。もちろん、これがどこにあるstr.c_str()のかは未定義です。実際にdictは、 はスタック オブジェクトです。ヒープのメモリ範囲 (str.c_str()常に存在する場所) がスタックのメモリ範囲より下にあることがよくあります。この場合、lower_boundこのアドレスをソートされた範囲に挿入したい場合は、解釈するアドレスの場合dict、最初にそうする必要があります。

解決策として、 があるので、operator<(char const *, std::string const &)単純に書くことができます

char (*idx)[20] = lower_bound(&dict[0], &dict[0] + dictlen, str);

...しかし、本当に探しているのでしょうstd::findか?

于 2015-01-05T09:25:09.403 に答える