每个C ++都有一个指针

时间:2012-07-23 05:10:38

标签: c++ visual-c++ pointers foreach iterator

我正在尝试在C ++中为每个循环使用指向数组内部的数组。下面的代码不起作用,因为“for each statement不能对'int *'类型的变量进行操作”。我更喜欢使用new运算符,以便数组在堆上,而不是堆栈,但我似乎无法在这里找出语法。有什么建议吗?

#include <iostream>
using namespace std;

int main() {
    int total = 0;

    int* array = new int[6];
    array[0] = 10; array[1] = 20; array[2] = 30;
    array[3] = 40; array[4] = 50; array[5] = 60;

    for each(int i in array) {
        total += i;
    }

    cout << total << endl;
}

6 个答案:

答案 0 :(得分:2)

你可以像这样使用for循环:

for (int i = 0; i < 6;i++)
{
total += array[i];
}

虽然使用“gcnew”使用“for each”的答案已经给出,所以我省略了。作为替代方案,您还可以使用以下向量:

#include <iostream>
#include <vector>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int total = 0;
    vector<int> myarray;

    myarray.push_back(10);
    myarray.push_back(20);
    myarray.push_back(30);
    myarray.push_back(40);
    myarray.push_back(50);
    myarray.push_back(60);

    for each(int i in myarray) {
        total += i;
    }

    cout << total << endl;
    return 0;
}

希望这会有所帮助......

答案 1 :(得分:2)

C ++ 0x引入了基于范围的for循环,在其他语言中等于foreach。它们的语法是这样的:

int arr[5]={1,2,3,4,5};
for( int & tmp : arr )
{
//do something
}

这些循环适用于C样式数组,初始化程序列表以及为其返回迭代器定义的具有begin()和end()函数的任何类型。 我坚信int *没有返回迭代器的begin()和end()函数,因为它只是一个原始指针。我也相信其他foreach - 等同于Qt中的foreach,或者您发布的内容,以相同的方式工作,因此您不能像这样使用它们。 msdn 表示它适用于集合

for each (type identifier in expression) {
      statements
}
  

表达式:

     

托管数组表达式或集合。编译器必须能够       将集合元素从Object转换为标识符类型。       expression计算为实现IEnumerable,IEnumerable的类型,       或者定义GetEnumerator方法的类型。在里面       后一种情况,GetEnumerator应该返回一个实现的类型       IEnumerator或声明IEnumerator中定义的所有方法。

再一次,你有一个原始指针,所以它不起作用。

答案 2 :(得分:2)

你正在使用的for each是一个Visual C ++扩展,甚至不被一些微软员工推荐(我知道我听说过STL说不好的事情,我不记得在哪里)。

还有其他选项,例如来自C ++ 11的std::for_eachrange-based for(尽管我认为Visual C ++尚不支持)。但是,这不是你应该在这里使用的。您应该使用std::accumulate,因为这是它的作业:

total = std::accumulate(array, array + 6, 0);

如果你真的只对如何使用这个Microsoft for each结构感兴趣,那么,我很确定如果你只有一个指针就不能。您应该使用std::vector代替。无论如何你应该这样做。

答案 3 :(得分:1)

您必须使用std::vectorstd::array等标准库集合才能使用for each

请注意,此codee我不是标准C ++,因此不可移植,因为for each是Visual C ++扩展。我建议使用std::for_each或C ++ 11自动远程循环。

答案 4 :(得分:0)

我能想到的唯一方法是迭代引用类型数组,特别是如果你想在堆上存储

Here Microsoft shows you怎么做

但对于您的情况,最简单的替代方法(如果您希望堆上的数组)将如下所示: -

 array<int>^ arr = gcnew array<int>{10, 20, 30, 40. 50, 60};
 int total = 0;    

for each (int i in arr){
  total+=i;
}

gcnew在垃圾回收堆上创建托管类型(引用或值类型)的实例。评估gcnew表达式的结果是对正在创建的类型的句柄(^)。

答案 5 :(得分:0)

VC ++与ISO / ANSI C ++没有什么不同。任何告诉你它的人都是错的。现在,回答你对每个陈述的问题。 ISO C ++规范中没有这样的声明。 Microsoft支持C#中的'foreach'语句,作为.Net框架的一部分。因此,Visual Studio可能会支持此功能,但我建议不要使用它。

就像用户shubhansh回答了一些回复一样,尝试使用矢量。但是,我猜你想使用通用大小,而不是硬编码。以下for循环可以帮助你:

    for(vector<int>::size_type i =0; i<myarray.size();i++)
{
total+=1;
}

这是迭代ISO标准定义的向量的完美方式。 希望这有助于您的发展。 干杯!