我如何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()
吗?
如果您使用的是 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))
{
// ...
}
你的总体思路很好。但ar[N]
不是为您“保留”。取消引用未分配的变量将导致未定义的行为。您想将std::find
结果与进行比较ar + N
,这不涉及取消引用。
&ar[N] 是在没有找到任何东西时检查情况的有效值吗?
您可以使用ar+N
代替&ar[N]
,因为ar +N
它是安全的,但&ar[N]
属于未定义行为的区域(实际上对此存在长期争论)。
从语义上讲,第二个参数实际上是范围的 结尾,因此当范围内没有找到任何内容时,将返回作为第二个参数传递的任何内容。在您的情况下,ar + N
是第二个参数,它也表示范围的结束。所以你可以这样写:
if ( std::find(ar, ar + N, value) != (ar + N) )
{
//value found
}
不,ar[N]
在数组末尾取消引用一个元素,所以这是非法的。
请记住,这ar[N]
相当于*(ar + N)
- 所以它显然是一个取消引用。
去吧ar + N
。在数组末尾有一个指针 1 是合法的,取消引用它是非法的。
无需使用 std::begin 或 std::end()
int ar[N];
if ( std::find(ar, ar + N, value) != ar+N ){ /**/ }