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

C++迭代一个大小未知的整数数组?,c++,C++,我有以下数组: int* myArray = new int[45]; 如果我想迭代每个元素而不知道数组的实际大小,我需要使用for_ 如果是这样的话,那么你会如何为每个人写这封信?我浏览了下面的网站,阅读了每一篇文章,但不知道如何把它们放在一起 更新:在这种情况下,A for_each不是一个好的选择,因为必须知道数组的大小。向量是完成这类任务的正确方法。在本例中,我使用数组的原因是为了学习。如果这是一个严肃的项目,我会转向列表/向量之类的东西。您描述了一个int数组,而不是一个实现Inpu

我有以下数组:

int* myArray = new int[45];
如果我想迭代每个元素而不知道数组的实际大小,我需要使用for_

如果是这样的话,那么你会如何为每个人写这封信?我浏览了下面的网站,阅读了每一篇文章,但不知道如何把它们放在一起


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

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

如果要使用for_each,则需要使用一个向量、列表或实现一个类来跟踪它包含的元素的数量。在我看来,仅仅使用向量要容易得多

如果只想迭代当前数组,假设它以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]);
在我看来,指针方法更干净

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

注意,当问题第一次发布时,所涉及的数组被声明为

int myArray[45];
这个答案是针对那个特殊情况的

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

for (int& i : myArray) {
  std::cout << i << "\n";
}
C++11还提供和,您可以将其与固定大小的数组一起使用以获取迭代器:

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);
}
每个人都可以用一个。在本例中,您已经为数组中的45个元素分配了空间,但由于它为NULL,如果您尝试执行任何操作,可能会得到segfault。您要么需要保存数组的值,要么使用类似于sizeofmyArray/sizeofmyArray[0]的东西,这有其自身的问题

无论如何,对于这里的每个for_,如果我们实际上有45个元素:

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

无论如何,这是使用向量的部分原因:.begin和.end减少了使用错误索引时的错误。

如果使用MSVC,则可以对每个向量使用

for each(int i in arr) {
    cout << i << ' ';
}
注意:这只适用于声明数组的代码块

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

for(int i : arr) {
    cout << i << ' ';
}
如果您打算使用std::for_:

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

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

@Kerrek SB,你是什么意思?它只有一行代码:或者你的意思是它不会编译,因为我们在这种情况下不使用for_?如果它不正确,即使只有一行代码也可能无法编译…@Kerrek SB,那么写这行代码的正确方法是什么?int myArray[45]={1,5,-8,…};,或者只是int myArray[45];。如果数组大小固定,则可以使用模板函数,请参见“编辑我的答案”。指针是输入迭代器。@Kerrek SB-此处引用的for_都是STL模板-我想他指的是c++11中基于范围的for循环,而不是for_each算法。@jahhaj-请注意,我更正了我的答案,我是在您第一次评论后意识到这一点的。但我所说的仍然有效,因为_each对此无效,因为他正在处理一个他不知道其大小的列表。@Geoffrey:好的,注释已删除。错误:在“:”之前不允许函数定义,令牌编译因-Wfatal错误而终止@在GCC4.6+中,通过添加-std=c,您已经启用了c++11模式++11@Intrus如果您使用的是gcc,它是最新版本吗?您是使用-std=c++11编译的吗?@Intrus抱歉,对于c++11示例,您需要c++11支持。对于GCC,您需要标记-std=c++0x。第二个例子用C++ 03。@ JuangopANZA& TXASBRUS-我是新的C++,所以我不知道这一点,我只是使用Visual Studio 2010。我已经尝试了所有这些,并且诚实地说,这一个工作完美无瑕:对于EARCHNT I在ARR中{CUT@ ITEUS注意到,每一个都是一个扩展,所以它不是标准C++。它会使你的代码不可移植到其他平台。这对你来说可能不是问题,但它是值得知道的。@ JuangopaZa谢谢你JuangopangZa,我会记住这一点,以备将来参考。