在C ++中遍历数组的推荐方式是什么?

时间:2018-10-01 09:00:20

标签: c++ arrays

我正在学习C ++(对JavaScript很有信心),但是找不到与JS array.length;等效的C ++。我想要一种基于数组长度的遍历数组的简单方法吗?

我已经遵循了许多教程,但是所有要求在循环中手动声明数组长度(或将其推送到函数中)的接缝是什么?

下面的代码出错,添加#include会导致编译器错误(DEV ++)。

是否有C ++或为什么没有简单调用数组长度的原因?

#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;
    }
}

4 个答案:

答案 0 :(得分:8)

对于像这样的C样式数组,可以使用range-based for loops

for (int value : shoppingList)
{
    std::cout << value << '\n';
}

关于从数组中获取元素的数量,有一个“技巧”:您知道数组本身的大小,并且知道数组中每个元素的大小。这意味着,如果将数组的大小除以每个元素的大小,将得到元素的数量。

简而言之

size_t numberElements = sizeof shoppingList / sizeof shoppingList[0];

重要说明:此“技巧”仅适用于实际数组!一旦数组衰减到指针(指向它的第一个元素,通常会发生),剩下的就是指针。无法获取它指向的内存大小,因此无法使用此“技巧”。


正如我的评论中所述,“最佳”解决方案是使用std::arraystd::vector

答案 1 :(得分:1)

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

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

请注意,计数器是usinf std::size_t,以匹配std::size(...)的结果的正负号。另外,请不要使用其他答案中建议的sizeof hack:这是一个陷阱!将指针传递给cde时,它会很高兴地进行编译,但也会产生错误的结果。

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

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

答案 2 :(得分: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;
}
}

答案 3 :(得分: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;
}