【问题标题】:How to define iterator in different directions for N dimensional nested array?如何为N维嵌套数组定义不同方向的迭代器?
【发布时间】:2017-04-25 15:04:49
【问题描述】:

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

vector<vector<double> > array2D;

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

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

【问题讨论】:

  • 你有没有尝试过?如果是这样,请发布。
  • This 可能会帮助您。请注意,如果您使用的是矩阵,您可能应该只获得一个矩阵库。他们已经完成了所有这些工作。

标签: c++ arrays iterator std


【解决方案1】:

您可以使用 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

【讨论】:

    猜你喜欢
    • 2013-04-03
    • 2020-05-04
    • 2015-10-17
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 2012-12-11
    相关资源
    最近更新 更多