您可以使用 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
enumerateColumn 和 enumerateRow 函数访问请求行或列中的每个值。要实现此迭代,您只需设置所需的行/列索引。为每个列/行值调用 std::function,因此您可以在内部进行任何操作。使用这种方法,您可以“隐藏”行/列迭代机制,只允许轻松访问每个行/列元素。
在最后 2 次操作之后,结果表将具有以下值:
10 2 3
20 5 6
100 200 300