15

既存のレガシー アレイから新しい/std::findを作成せずにレガシー アレイを実行するにはどうすればよいですか?std::vectorstd::array

例えば:

int ar[N];

if ( std::find(ar, ar + N, value) != &ar[N] ){ /**/ }

&ar[N]何も見つからない場合の状況を確認するための有効な値はありますか? &ar[N]のアナログのように正しく使用していると確信できますstd::vector::end()か?

4

5 に答える 5

26

c ++ 11を使用している場合は、次を使用できます。

int arr[N];
if (std::end(arr) == std::find(std::begin(arr), std::end(arr), value))
{
    // ...
}

c ++ 98の場合、次を使用できます。

int arr[N];
int *begin = arr;
int *end = begin + N;

if (end == std::find(begin, end, value))
{
    // ...
}
于 2012-12-18T13:32:05.770 に答える
4

あなたの一般的な考えは良いです。しかしar[N]、あなたのために「予約」されていません。割り当てられていない変数を間接参照すると、未定義の動作が発生します。std::find結果をar + N、間接参照を含まない、と比較したい。

于 2012-12-18T13:31:48.023 に答える
3

&ar[N] は、何も見つからない場合の状況を確認するための有効な値ですか?

は安全ですが、未定義の動作の領域に分類されるため、ar+Nの代わりに使用できます(実際、これについては長い議論があります)。&ar[N]ar +N&ar[N]

意味的に言えば、2 番目の引数は実際には範囲の 終わりなので、範囲内にも見つからない場合は、2 番目の引数として渡すものは何でも返されます。あなたの場合、範囲の終わりar + Nも示す2番目の引数です。したがって、これを書くことができます:

if ( std::find(ar, ar + N, value) != (ar + N) )
{ 
       //value found
}
于 2012-12-18T13:31:39.227 に答える
2

いいえ、ar[N]配列の終わりの後に1つの要素を逆参照するため、不正です。

ar[N]これは-と同等であることを忘れないでください*(ar + N)。したがって、これは明らかに間接参照です。

ar + N代わりに行ってください。配列の終わりの後にポインタ1を付けることは合法であり、逆参照することは違法です。

于 2012-12-18T13:32:26.057 に答える