-1

我有以下数组:

int* myArray = new int[45];

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

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

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


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

4

4 回答 4

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);
}
于 2012-08-09T07:00:21.263 回答
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)。

于 2012-08-09T07:27:59.953 回答
1

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

如果要使用 for_each ,则需要使用vector,list或实现一个跟踪它包含的元素数量的类。IMO 更容易使用vector

如果您只想迭代当前数组,假设它是 0 终止:

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 指针方法更干净。

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

于 2012-08-09T06:59:30.483 回答
1

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

无论如何,在for_each这里,如果我们实际上有 45 个元素:

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

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

于 2012-08-09T07:06:55.227 回答