C++中的“!= data + arraySize”是什么意思?

7kqas0il  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(91)

已关闭。此问题需要更多focused。目前不接受回答。
**要改进此问题吗?**更新此问题,使其仅针对editing this post的一个问题。

昨天就关门了。
Improve this question
我在寻找一种在数组中找到给定int的方法,我找到了这个解决方案

#include <algorithm>
#include <iostream>
using namespace std;

int main() {
  int data[] = {23, 45, 56, 12, 34, 56};
  int target = 56;

  int arraySize = sizeof(data) / sizeof(*data);

  bool isPresent = std::find(data, data + arraySize, target) != data + arraySize;

  if (isPresent) {
    cout << "The element is present";
  } else {
    cout << "The element is not present";
  }
  return 0;

字符串
现在我测试了一下,它能用,但我想知道为什么在find()之后会有这个!= data + arraySize?希望得到解释

2guxujil

2guxujil1#

指向数组data中可访问元素的指针范围,该数组声明为

int data[] = {23, 45, 56, 12, 34, 56};

字符串
[data, data + arraySize)
如果在数组中没有找到目标值,则算法返回指向数组的最后一个元素data + arraySize之后的内存的指针。否则,算法返回指向数组中找到的元素的指针。
请注意,表达式datadata + 0指向数组数据的第一个元素。表达式data + 1指向数组的第二个元素。这与data + i指向数组的i-th元素的表达式类似。
此行将更易读

bool isPresent = std::find(data, data + arraySize, target) != data + arraySize;


如果把它改写成

#include <iterator>

//...
bool isPresent = std::find( std::begin( data ), std::end( data ), target ) != std::end( data );

goucqfw6

goucqfw62#

由于data是一个数组(不是指针),arraySize = sizeof(data) / sizeof(*data)计算该数组中的元素数。
data + arraySize在加上arraySize之前将data转换为指针,因此结果等于&data[arraySize],它是指向(不存在的)int的指针,该指针是数组data的末尾。
这是C中的一个有效指针。它的特殊之处在于它不能被解引用(解引用会导致未定义的行为),但可以(在其他一些事情中)测试C中其他指针(相同类型)的相等性。
std::find(),像C标准中的许多其他标准算法一样,接受一对表示范围的迭代器,第一个迭代器标识范围的开始,第二个迭代器表示范围的结束。标准库中的迭代器(或多或少)是一个通用指针。
因此,在调用std::find(data, data + arraySize, target)时,data被转换为指针(等于&array[0])和data + arraySize(如上所述)等于&data[arraySize](一个指针越过末尾)。对于std::find(),这对参数&data[0]&data[arraySize]意味着它检查数组data的所有元素,以搜索target
如果找到targetstd::find()返回一个迭代器,它引用array的相应元素。否则,它返回结束迭代器(即代码中的&data[arraySize])。
如果data包含target,则总表达式std::find(data, data + arraySize, target) != data + arraySizetrue,否则为false
在现代C
中(从C11开始),相同的表达式可以重写为std::find(std::begin(data), std::end(data), target) != std::end(data)。请记住,C标准库中的end迭代器是对范围末尾的引用。

相关问题