可视化C++,每个都有一个指针
visual C++ for each With a Pointer
我试图在C++中的for each循环中使用一个指向数组内部的指针。下面的代码不起作用,因为"for each语句不能对'int*'类型的变量进行操作"。我更喜欢使用新的运算符,这样数组就在堆上而不是堆栈上,但我似乎无法理解这里的语法。有什么建议吗?
#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;
}
您正在使用的for each
是一个Visual C++扩展,一些微软员工甚至不推荐它(我知道我听STL说了一些不好的话,我不记得在哪里了)。
还有其他选项,如std::for_each
,以及基于C++11的范围(尽管我认为Visual C++还不支持这一点)。然而,这不是你应该在这里使用的。你应该使用std::accumulate
,因为这是它的任务:
total = std::accumulate(array, array + 6, 0);
如果你真的只是对如何使用这个Microsoft for each
结构感兴趣,那么,如果你只有一个指针,我敢肯定你做不到。您应该使用std::vector
。无论如何你都应该这么做。
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转换为标识符类型。表达式计算为实现IEnumerable、IEnumeraable和IEnumeral的类型,或定义GetEnumerator方法的类型。在在后一种情况下,GetEnumerator应该返回一个实现IEnumerator声明了在IEnumerator.中定义的所有方法。
再一次,你有一个原始指针,所以它不会工作。
您可以始终使用这样的循环:
for (int i = 0; i < 6;i++)
{
total += array[i];
}
虽然,使用"for each"使用"gcnew"的答案已经给出了,所以我省略了它。作为一种替代方案,您也可以使用如下矢量:
#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;
}
希望这会有所帮助。。。
我能想到的唯一方法是迭代引用类型的数组,尤其是如果你想在堆上存储
在这里,微软向你展示了如何做到
但对于您的情况,最简单的选择(如果您希望您的数组位于堆上)如下:-
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表达式的求值结果是要创建的类型的句柄(^)。
必须使用标准库集合(如std::vector
或std::array
)才能使用for each
。
请注意,此代码I不是标准C++,因此不可移植,因为for each
是Visual C++扩展。我建议使用std::for_each
或C++11自动范围循环。
VC++与ISO/ANSI C++没有什么不同。任何告诉你这是错误的。现在,为每一个陈述回答您的问题。ISO C++规范中没有这样的声明。作为.Net框架的一部分,Microsoft支持C#中的"foreach"语句。因此,虽然我建议不要使用它,但这可能在Visual Studio中得到支持
就像用户shubhansh回复了几个回复一样,尝试使用向量。然而,我猜你会喜欢使用通用大小,而不是硬编码。下面的for循环在这方面会对你有所帮助:
for(vector<int>::size_type i =0; i<myarray.size();i++)
{
total+=1;
}
正如ISO标准所定义的那样,这是迭代向量的完美方式。希望这能帮助你的发展。干杯
- 我可以有一个 ELI5 作为参考和指针以及何时使用它们吗?
- 有没有办法在同名类 (c++) 中为对象分配一个指针变量
- C++中是否有一个函数可以为您获取指向该节点的所有指针的地址空间
- 如何获得GUID编码器,如果我在IMFTransform上有一个指针?
- 如果我有一个指向矢量元素的指针,而不是迭代器,如何删除它?
- 为什么我在C++中有一个空指针取消引用
- 为什么静态指针返回函数中有一个"静态"键?
- 从指向成员的指针的模板推导,其中至少有一个指向成员的指针是已知的
- 带有显式构造函数的智能指针使我有一个错误
- 删除指向排序的字符串阵列的指针会在运行后会有一个错误
- 难道不应该有一个类似于"this"的与名称无关的类指针供成员函数在C++中引用吗?
- 指针怎么能有一个字符串作为它的值
- 我可以有一个模板函数指针的 std::vector 吗?
- 是否有可能有一个指针指向由奇怪的递归模板创建的基类
- 可视化C++,每个都有一个指针
- 我可以在对象中有一个指针向量 *** p 吗?
- 从Cocos2d::Layer派生的类有一个指针数据成员.这个元素也有一个向量容器.调用vector::push_bac
- 是否可能有一个指针字面量
- 是否可能有一个指针指向指向第一个指针所指向的变量的指针
- 克隆一个对象,当我有一个指针指向它的基类