我正在尝试在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;
}
答案 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_each
和range-based for(尽管我认为Visual C ++尚不支持)。但是,这不是你应该在这里使用的。您应该使用std::accumulate
,因为这是它的作业:
total = std::accumulate(array, array + 6, 0);
如果你真的只对如何使用这个Microsoft for each
结构感兴趣,那么,我很确定如果你只有一个指针就不能。您应该使用std::vector
代替。无论如何你应该这样做。
答案 3 :(得分:1)
您必须使用std::vector
或std::array
等标准库集合才能使用for each
。
请注意,此codee我不是标准C ++,因此不可移植,因为for each
是Visual C ++扩展。我建议使用std::for_each
或C ++ 11自动远程循环。
答案 4 :(得分:0)
我能想到的唯一方法是迭代引用类型数组,特别是如果你想在堆上存储
但对于您的情况,最简单的替代方法(如果您希望堆上的数组)将如下所示: -
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标准定义的向量的完美方式。 希望这有助于您的发展。 干杯!