在C++中,循环遍历数组的推荐方法是什么?

4
我正在学习C++(对JavaScript也有一定的信心),我找不到与JS中array.length;相对应的C++函数。我想要一个简单的方式根据数组长度循环遍历数组?
我已经跟随了很多教程,但似乎所有的教程都需要在for循环中手动声明数组长度(或将其推入函数中)?
以下代码会出现错误,并添加#include会导致编译器错误(DEV++)。
是不是C++没有像JS一样可以简单获取数组长度的函数呢?
#include <iostream>
using namespace std;

int main () {
    int shoppingList [3] = {1, 2, 3};
    for (int i=0; i < shoppingList.size(); i++) {
        cout << shoppingList[i] << endl;
    }
}

1
你正在使用C风格的数组。你应该使用vector - Qubit
4
这样的数组继承自C,因此不是具有成员函数的对象。阅读有关std::arraystd::vector的更多信息,以寻找可能的替代方案。 - Some programmer dude
目前在网上没有被认可的好的C++教程,试错也无法学习C++。请查看书单 - molbdnilo
不确定dev-c++的当前状态如何,但我认为非常古老和过时(2015年?)。在Windows上,我建议使用Visual Studio 2017 Community,在Mac上有XCode和跨平台/ Linux上有Eclipse、NetBeans,我相信CodeBlocks仍然不错(对我来说已经过去了几年)。这可能会有助于解决Some programmer dude的答案中提到的问题。 - Fire Lancer
4个回答

14

对于像您所拥有的 C 风格数组,您可以使用基于范围的 for 循环:

for (int value : shoppingList)
{
    std::cout << value << '\n';
}
关于从数组中获取元素的数量,有一个“技巧”:您知道数组本身的大小,以及数组中每个元素的大小。这意味着,如果您用数组的大小除以每个元素的大小,就可以得到元素的数量。
简而言之
size_t numberElements = sizeof shoppingList / sizeof shoppingList[0];

重要提示:这个“技巧”仅适用于实际的数组!一旦一个数组已经退化成指针(通常发生在指向它的第一个元素时),你只剩下指针了。没有办法获取它所指向内存的大小,因此无法使用这个“技巧”。


就像我在评论中提到的那样,“最好”的解决方案是使用std::arraystd::vector


我尝试了这个,但是 DEV-C++ 给出了一个错误提示:"在 C++98 模式下不允许使用基于范围的 'for' 循环"。 - Ben Jones
1
@BenJones:尝试使用-std=c++17(Clang/GCC)或/std=c++17(MSVC)。 - JVApen
4
自C++17以来,可以使用std::size()来获取数组元素的数量。它还具有一个优点,当用于已经衰减为指针的数组时,会抛出编译器错误。 - zett42
1
即使没有C++17,编写像std::size这样的短模板也比使用技巧并担心其注意事项要好。 - StoryTeller - Unslander Monica

1

内置类型在C++中没有成员函数。然而,有一个非成员函数std::size(array)

for (std::size_t i{}; i != std::size(shoppingList); ++i) {
    // ...
}

请注意,计数器正在使用std::size_t来匹配std::size(...)结果的符号。此外,请不要使用其他答案中建议的sizeof hack:这是一个陷阱!当传递指针时,代码会很愉快地编译,但它也会产生错误的结果。

当然,在C++中迭代范围的惯用方式,包括数组,是(假设您只需要值而不是它们的位置):

for (int val: shoppingList) {
    // ...
}

0

数组没有直接的size()成员函数,你可以像这样找到数组的大小int size = sizeof(arr)/sizeof(arr[0]);并在for循环中使用它。

#include <iostream>
using namespace std;

int main () {
int shoppingList [3] = {1, 2, 3};
int size = sizeof(shoppingList)/sizeof(shoppingList[0]);
for (int i=0; i < size(); i++) {
    cout << shoppingList[i] << endl;
}
}

0
你可以这样做:sizeof(A)/sizeof(A[0])。这将给你数组中元素的总数。
我们来看一个例子 A = {1,2,3,4,5} // 都是整数 如果你计算 sizeof(A)/sizeof(A[0]),它将给你 5,正如你所见,你无需手动输入数组的大小。
希望对你有所帮助。 :)
#include <iostream>
using namespace std;

int main()
{
A = {1,2,3,4,5};
for (int i = 0; i< sizeof(A)/sizeof(A[0]); i++)
//whatever you want to do with this
return 1;
}

你的示例无法编译。 - pptaszni
是的,它不会编译,因为看看那个for循环哈哈,for循环体中没有语句。你可以添加跳转语句“continue”,然后它应该就能编译了。总的来说,我只是举了一个例子,说明如何遍历预定义数组而不手动输入数组大小。 - Arjun Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接