如何在C ++ 11中将基于范围的循环应用于数组数组?

时间:2014-01-28 15:30:16

标签: arrays pointers c++11 foreach

#include <iostream>
using namespace std;

int main(){
    int arr[4] = {1,2,3,4};
    int arr2[4] = {5,6,7,8};
    int **arrPtr;

    arrPtr[0] = arr;
    arrPtr[1] = arr2;

    for (int *a : arrPtr ){
        for (int i : a){
            cout << i << endl;
        }
    }
}

我知道这种实现不是要走的路,而是要在最后显示内涵。基本上我试图打印另一个双指针列出的数组的内容。 有没有办法让这段代码有效?

2 个答案:

答案 0 :(得分:3)

#include <iostream>

int main() {
    int m[][4] = {
                    { 0, 1, 2, 3 },
                    { 4, 5, 6, 7 },
                    { 8, 9, 0, 1 },
                    { 2, 3, 4, 5 },
                 };

    for(auto &line : m) {
        for(auto &value : line) {
            std::cout << value << ' ';
        }
        std::cout << std::endl;
    }
}

http://coliru.stacked-crooked.com/a/d603241402fcc886

奖金

请注意,这也有效:

#include <iostream>

int main() {
    for(auto &line : (int [][4])
            {
                { 0, 1, 2, 3 },
                { 4, 5, 6, 7 },
                { 8, 9, 0, 1 },
                { 2, 3, 4, 5 },
            }) {
        for(auto &value : line) {
            std::cout << value << ' ';
        }
        std::cout << std::endl;
    }
}

答案 1 :(得分:0)

新的range-for循环不适用于原始指针类型,因为它们不包含大小信息。如果你在编译时知道它们的长度,你可以将它们作为指向数组的指针并在range-for中使用。这样的代码可能很适合,但可以使用std::arraystd::vector进行实际使用。

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

int main(){
    int arr[4] = {1,2,3,4};
    int arr2[4] = {5,6,7,8};
    unique_ptr<int*[]> arrPtrHolder(new int*[2]);
    int **arrPtr = arrPtrHolder.get();

    arrPtr[0] = arr;
    arrPtr[1] = arr2;

    for (int *a : *(int*(*)[2])(arrPtr)){
        for (int i : *(int (*)[4])(a)){
            cout << i << endl;
        }
    }
}

http://coliru.stacked-crooked.com/a/a207f5c4853b1e1f