2017-04-25 20 views
0

例如我有一个使用double作为数据类型的2D数组。如何定义N维嵌套数组的不同方向的迭代器?

vector<vector<double> > array2D; 

// Set up sizes. (HEIGHT x WIDTH) 
array2D.resize(HEIGHT); 
for (int i = 0; i < HEIGHT; ++i) 
    array2D[i].resize(WIDTH); 

我该如何定义迭代器,它可以沿给定列的行方向或给定行的列方向进行迭代?

+1

你尝试过什么?如果是这样,发布。 –

+3

[This](http://stackoverflow.com/questions/14924912/computing-column-sums-of-matrix-vectorvectordouble-with-iterators)可能会帮助你的方式。请注意,如果您使用的是矩阵,您应该只需要一个矩阵库。他们已经完成了所有这些工作。 – NathanOliver

回答

0

您可以使用std :: function来访问每个元素(列或行)和枚举器。

#include <iostream> 
#include <vector> 
#include <functional> 

typedef std::vector<std::vector<int>> TTable; 

void enumerateColumn(size_t column, TTable & table, std::function<void(int&, size_t)> op) 
{ 
    for(size_t index = 0; index < table.size(); ++index) 
    { 
     op(table[index][column], index); 
    } 
} 

void enumerateRow(size_t row, TTable & table, std::function<void(int&, size_t)> op) 
{ 
    auto& row_tab = table[row]; 
    for (size_t index = 0; index < row_tab.size(); ++index) 
    { 
     op(row_tab[index], index); 
    } 
} 

int main() 
{ 
    TTable table = 
    { 
    { 1,2,3 }, 
    { 4,5,6 }, 
    { 7,8,9 } 
    }; 

    std::cout << "Show Column: " << 2 << std::endl; 
    enumerateColumn(2, table, [] (int& val, size_t index) 
    { 
     std::cout << "Index: "<< index <<" Value: "<< val << std::endl; 
    }); 

    std::cout << "Show Row: " << 1 << std::endl; 
    enumerateRow(1, table, [] (int& val, size_t index) 
    { 
     std::cout << "Index: " << index << " Value: " << val << std::endl; 
    }); 


    std::cout << "Change Column: " << 0 << std::endl; 
    enumerateColumn(0, table, [] (int& val, size_t index) 
    { 
     val = 10 * (index + 1); 
    }); 

    std::cout << "Change Row: " << 2 << std::endl; 
    enumerateRow(2, table, [] (int& val, size_t index) 
    { 
     val = 100 * (index + 1); 
    }); 

    return 0; 
} 

输出:

Show Column: 2 
Index: 0 Value: 3 
Index: 1 Value: 6 
Index: 2 Value: 9 
Show Row: 1 
Index: 0 Value: 4 
Index: 1 Value: 5 
Index: 2 Value: 6 
Change Column: 0 
Change Row: 2 

enumerateColumnenumerateRow功能访问请求行或列中的每个值。为了实现这个迭代,你只需要设置所需的行/列索引。每个列/行值都会调用std :: function,所以你可以在里面进行任何操作。使用这种方法,您可以“隐藏”行/列迭代的机制,只需轻松访问每个行/列元素即可。

最后2次操作后,结果表将有下一个值:

10 2 3 
20 5 6 
100 200 300