C ++迭代一个大小未知的整数数组?

时间:2012-08-09 06:56:44

标签: c++

我有以下数组:

int* myArray = new int[45];

如果我想在不知道数组的实际大小的情况下迭代每个元素,我需要使用for_each

如果是这样,那你怎么写for_each?我正在查看以下网站并阅读for_each,但无法弄清楚如何将它们放在一起。

http://www.cplusplus.com/reference/algorithm/for_each/


更新:在这种情况下,for_each不是一个好选择,因为必须知道数组的大小。向量是完成此类任务的正确方法。在这种情况下,我使用数组的原因是出于学习目的。如果这是一个严肃的项目,我会转向像Lists / Vectors这样的东西。

4 个答案:

答案 0 :(得分:4)

注意首次发布问题时,相关数组被声明为

int myArray[45];

这个答案涉及那个特例。

如果您支持C ++ 11,则可以使用基于范围的循环:

for (int& i : myArray) {
  std::cout << i << "\n";
}

C ++ 11还提供std::beginstd::end,您可以使用固定大小的数组来获取迭代器:

std::for_each(std::begin(myArray), std::end(myArray), <func>);

另一个适用于C ++ 03并且处理固定大小数组的选项是定义一个函数模板:

// taken a fixed size array by reference and loop over it
template <typename T, unsigned int N>
void array_for_each( T (&a)[N]) {

  for (unsigned int i = 0; i < N; ++i) {
    // do something with array elements
    std::cout << a[i] << " ";
  }

}

int main() {
  int a[5];
  array_for_each(a);
}

答案 1 :(得分:2)

如果您使用MSVC,则可以使用“for each”。

for each(int i in arr) {
    cout << i << ' ';
}

注意:这仅适用于声明数组的代码块。

如果没有,您还可以在C ++ 11标准中使用新的基于范围的for循环。

for(int i : arr) {
    cout << i << ' ';
}

如果你想要std :: for_each:

for_each(arr,arr + 10,[] (int i) {
        cout << i << ' ';
});

注意:这需要知道数组的大小(在本例中为10)。

答案 2 :(得分:1)

你已经描述了一个int数组,而不是一个实现InputIterator的类,这就是for_each的设计目标,即使你可以用它来迭代一个数组,但你需要知道它的大小迭代它的数组。

如果你想使用for_each,你需要使用vectorlist,或者实现一个跟踪它包含的元素数量的类。 IMO使用vector

要容易得多

如果你想迭代你当前的数组,假设它被终止:

for(int *value = myArray; *value != 0; ++value)
  printf("%d\n", *value);

或者,您可以使用索引:

for(int index = 0; myArray[index] != 0; ++index)
  printf("%d\n", myArray[index]);

IMO指针方法更清晰。

此代码仍然很危险,您应该跟踪单独变量中的记录数,或使用向量。

答案 3 :(得分:1)

您可以使用for_each。在这种情况下,您已为数组中的45个元素分配了空间,但由于它为NULL,因此如果您尝试执行任何操作,可能会遇到段错误。您需要保存数组的值,或使用类似sizeof(myArray)/sizeof(myArray[0])的东西(它有自己的问题)。

无论如何,对于for_each,如果我们实际上有45个元素:

 std::for_each(myArray, myArray + 45, <func>);

无论如何,这是使用向量的部分原因:.begin().end()通过使用错误的索引来减少错误。