gpt4 book ai didi

c++ - C++中的 "for each"循环如何知道数组的长度

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:05 25 4
gpt4 key购买 nike

我正在查看来自 http://www.cplusplus.com/doc/tutorial/arrays/ 的以下示例我不知道第二个 for 循环是如何工作的。 for 循环如何知道数组何时结束。如果它能解决这个问题,为什么第一个循环不使用类似的方法?我的印象是无法确定数组的长度。我不确定如何调和这些概念。谢谢!

编辑:感谢所有出色的回答!

#include <iostream>
using namespace std;
int main()
{
int myarray[3] = {10,20,30};

for (int i=0; i<3; ++i)
++myarray[i];

for (int elem : myarray)
cout << elem << '\n';
}

最佳答案

之所以可行,是因为 for 循环有效地1 使用了 std::beginstd::end。反过来,它们可以工作,因为它们专门为内置数组提供重载,如下所示:

template <class T, size_t N>
T *begin(T (&array)[N]) {
return array;
}

template <class T, size_t N>
T *end(T (&array)[N]) {
return array+N;
}

虽然它(显然)在最初的(1998 年)C++ 标准发布之前尚未实现,但该技术不需要任何超出 C++98 中可用语言功能的语言功能。 C++11 编写了该技术并投入使用。

因为在这种情况下,参数被指定为对数组的引用,只有当参数确实是数组时类型推导才会成功。对于 std::begin,还有一些版本支持其他参数类型并使用(例如)begin()end() 集合的成员,如果该类型匹配的话。


<子>1. 在这种情况下,“有效”意味着在某些情况下,基于范围的 for 循环使用 beginend,而在其他情况下则不使用。如果您对技术细节感兴趣,它们不会用于数组,而是直接完成类似的计算。同样,对于具有 beginend 成员的容器类型,将直接使用它们。如果两者都不为真,则使用 begin(range)end(range),它们可以使用 std::begin/std::end,或通过参数相关查找找到的 begin(x)/end(x) 对。

关于c++ - C++中的 "for each"循环如何知道数组的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25232435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com