如何在不使用现有旧版数据的新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()
的模拟吗?
答案 0 :(得分:19)
如果您使用的是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))
{
// ...
}
答案 1 :(得分:3)
你的总体想法很好。但ar[N]
并非“保留”给你。取消引用未分配的变量将导致未定义的行为。您希望将std::find
结果与ar + N
进行比较,但不涉及解除引用。
答案 2 :(得分:2)
& ar [N]是否在找不到任何内容时检查情况的有效值?
您可以使用ar+N
代替&ar[N]
,因为ar +N
是安全的,但&ar[N]
属于未定义行为的区域(事实上存在长期争论) )。
从语义上讲,第二个参数是范围的实际 end ,因此当找到 nothing 时,无论你传递的第二个参数是什么范围中。在您的情况下,ar + N
是第二个参数,它也表示范围的 end 。所以你可以这样写:
if ( std::find(ar, ar + N, value) != (ar + N) )
{
//value found
}
答案 3 :(得分:2)
不,ar[N]
在数组结束后取消引用一个元素,因此它是非法的。
请记住,ar[N]
相当于*(ar + N)
- 所以它显然是一种解除引用。
改为使用ar + N
。在数组末尾后面有一个指针1是合法的,取消引用它是违法的。
答案 4 :(得分:0)
无需使用std :: begin或std :: end()
int ar[N];
if ( std::find(ar, ar + N, value) != ar+N ){ /**/ }