可视化C++,每个都有一个指针

visual C++ for each With a Pointer

本文关键字:有一个 指针 C++ 可视化      更新时间:2023-10-16

我试图在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::vectorstd::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标准所定义的那样,这是迭代向量的完美方式。希望这能帮助你的发展。干杯