我有以下数组:
int* myArray = new int[45];
如果我想在不知道数组的实际大小的情况下迭代每个元素,我需要使用for_each
?
如果是这样,那你怎么写for_each
?我正在查看以下网站并阅读for_each,但无法弄清楚如何将它们放在一起。
http://www.cplusplus.com/reference/algorithm/for_each/
更新:在这种情况下,for_each
不是一个好选择,因为必须知道数组的大小。向量是完成此类任务的正确方法。在这种情况下,我使用数组的原因是出于学习目的。如果这是一个严肃的项目,我会转向像Lists / Vectors这样的东西。
答案 0 :(得分:4)
注意首次发布问题时,相关数组被声明为
int myArray[45];
这个答案涉及那个特例。
如果您支持C ++ 11,则可以使用基于范围的循环:
for (int& i : myArray) {
std::cout << i << "\n";
}
C ++ 11还提供std::begin和std::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,你需要使用vector
,list
,或者实现一个跟踪它包含的元素数量的类。 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()
通过使用错误的索引来减少错误。