已关闭。此问题需要更多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?希望得到解释
2条答案
按热度按时间2guxujil1#
指向数组
data
中可访问元素的指针范围,该数组声明为字符串
是
[data, data + arraySize)
。如果在数组中没有找到目标值,则算法返回指向数组的最后一个元素
data + arraySize
之后的内存的指针。否则,算法返回指向数组中找到的元素的指针。请注意,表达式
data
或data + 0
指向数组数据的第一个元素。表达式data + 1
指向数组的第二个元素。这与data + i
指向数组的i-th
元素的表达式类似。此行将更易读
型
如果把它改写成
型
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
。如果找到
target
,std::find()
返回一个迭代器,它引用array
的相应元素。否则,它返回结束迭代器(即代码中的&data[arraySize]
)。如果
data
包含target
,则总表达式std::find(data, data + arraySize, target) != data + arraySize
为true
,否则为false
。在现代C中(从C11开始),相同的表达式可以重写为
std::find(std::begin(data), std::end(data), target) != std::end(data)
。请记住,C标准库中的end
迭代器是对范围末尾的引用。