2

我正在尝试在 C++ 中的每个循环中使用指向数组的指针。下面的代码不起作用,因为“for each 语句不能对'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;
}
4

6 回答 6

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;
}

希望这会有所帮助...

于 2012-07-23T05:15:25.423 回答
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() 函数,因为它只是一个原始指针。我也相信 Qt 中的其他-foreach等效项foreach或您发布的内容以相同的方式工作,因此您不能像这样使用它们。msdn说它适用于集合

for each (type identifier in expression) {
      statements
}

表达:

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

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

于 2012-07-23T05:33:32.387 回答
2

您使用的那个for each东西是一个 Visual C++ 扩展,甚至一些微软员工都不推荐(我知道我听说过STL说它不好,我不记得在哪里)。

还有其他选项,例如C++11 中的std::for_each基于范围的 for(尽管我认为 Visual C++ 尚不支持)。但是,这不是您应该在这里使用的。您应该使用std::accumulate,因为这是它的用途:

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

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

于 2012-07-23T05:39:47.720 回答
1

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

微软在这里向您展示了如何做到这一点

但是对于您的情况,最简单的选择(如果您希望将数组放在堆上)如下:-

 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 表达式的求值结果是正在创建的类型的句柄 (^)。

于 2012-07-23T05:32:22.637 回答
1

您必须使用标准库集合,例如std::vectorstd::array使用for each.

请注意,此代码不是标准 C++,因此不可移植,因为for each它是 Visual C++ 扩展。我建议使用std::for_eachC++11 自动范围循环。

于 2012-07-23T05:45:39.723 回答
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 标准定义的遍历向量的完美方式。希望这对您的发展有所帮助。干杯!

于 2012-07-23T07:52:02.423 回答