我如何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 ){ /**/ }