提问人:Pryhas 提问时间:11/17/2023 最后编辑:Vlad from MoscowPryhas 更新时间:11/17/2023 访问量:128
C++ 中的“!= data + arraySize”是什么意思?[关闭]
What does the "!= data + arraySize" mean in C++? [closed]
问:
我一直在寻找一种方法来在我的数组中找到给定的 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? 希望得到解释
答:
指向数组的可访问元素的指针范围,声明为data
int data[] = {23, 45, 56, 12, 34, 56};
是。[data, data + arraySize)
如果在数组中找不到目标值,则算法会在数组的最后一个元素 .否则,该算法将返回指向数组中找到的元素的指针。data + arraySize
注意该表达式或指向数组数据的第一个元素。表达式指向数组的第二个元素。这是一个指向数组元素的表达式。data
data + 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 );
评论
std::begin
std::end
array + number
由于是一个数组(不是指针),计算该数组中的元素数。data
arraySize = sizeof(data) / sizeof(*data)
data + arraySize
在添加 之前转换为指针,因此结果等于 等于 which 是指向数组末尾的一端(不存在)的指针。data
arraySize
&data[arraySize]
int
data
这是 C++ 中的有效指针。它的特殊之处在于它不能被取消引用(取消引用会导致未定义的行为),但可以(除其他一些外)测试与 C++ 中其他指针(相同类型)的相等性。
std::find()
与 C++ 标准中的许多其他标准算法一样,它接受一对表示范围的迭代器,第一个迭代器标识范围的开头,第二个迭代器表示该范围的末尾。标准库中的迭代器(或多或少)是一个通用指针。
因此,在调用中,被转换为指针(等于 ),并且(如上所述)等于(超过末尾的指针)。To ,这对参数表示它检查数组的所有元素,搜索 。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]
总表达式为 if contains ,否则。std::find(data, data + arraySize, target) != data + arraySize
true
data
target
false
在现代 C++ 中(从 C++11 开始),相同的表达式可以重写为 .请记住,C++ 标准库中的迭代器是对范围末尾的引用。std::find(std::begin(data), std::end(data), target) != std::end(data)
end
评论
std::find(data, data + arraySize, target)
int arraySize = sizeof(data) / sizeof(*data);
会更好,因为 - 然后会成为哪个是正确的类型auto arraySize = std::size(data);
auto
std::size_t
std::size
std::begin
std::end
arraySize
sizeof(anything)
std::size_t
int