std :: find在遗留阵列上

时间:2012-12-18 13:29:01

标签: c++ stl

如何在不使用现有旧版数据的新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()的模拟吗?

5 个答案:

答案 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 ){ /**/ }