15

我如何std::find在旧阵列上进行而不从现有旧阵列制作新的std::vector/std::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]属于未定义行为的区域(实际上对此存在长期争论)。

从语义上讲,第二个参数实际上是范围的 结尾,因此当范围内没有找到任何内容时,将返回作为第二个参数传递的任何内容。在您的情况下,ar + N是第二个参数,它也表示范围的结束。所以你可以这样写:

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

不,ar[N]在数组末尾取消引用一个元素,所以这是非法的。

请记住,这ar[N]相当于*(ar + N)- 所以它显然是一个取消引用。

去吧ar + N。在数组末尾有一个指针 1 是合法的,取消引用它是非法的。

于 2012-12-18T13:32:26.057 回答
0

无需使用 std::begin 或 std::end()

int ar[N];

if ( std::find(ar, ar + N, value) != ar+N ){ /**/ }
于 2020-05-16T05:41:12.513 回答