例如,我有一个使用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);
如何定义可以沿给定列的行方向或给定行的列方向迭代的迭代器?
答案 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