如何为N维嵌套数组在不同方向定义迭代器?

时间:2017-04-25 15:04:50

标签: c++ arrays iterator std

例如,我有一个使用double作为数据类型的2D数组。

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 个答案:

答案 0 :(得分:0)

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

dependencies {
    //Other dependencies
    classpath 'me.tatarka:gradle-retrolambda:3.4.0'
}

输出:

#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;
}

enumerateColumn enumerateRow 函数会访问请求行或列中的每个值。要实现此迭代,您只需设置所需的行/列索引。为每个列/行值调用std :: function,因此您可以在其中进行任何操作。使用此方法,您可以“隐藏”行/列迭代的机制,只允许轻松访问每个行/列元素。

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

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