Diciamo che ho una classe Matrix
che ho già implementato.
Matrix<float> mat(30, 30);
for(size_t row = 0; row < mat.rows(); row++) {//Assume Row-Major ordering for performance reasons
for(size_t column = 0; column < mat.columns(); column++) {
mat(row, column) = float(row+1) / float(column+1);
}
}
Vorrei aggiungere a questa implementazione alcuni concetti di "Row Iterator" e "Column Iterator". Una sorta di interfaccia come la seguente:
//public:
row_iterator begin_row(size_t row); //Is this intuitive?
const_row_iterator begin_row(size_t row) const;
const_row_iterator cbegin_row(size_t row) const;
row_iterator end_row(size_t row);
const_row_iterator end_row(size_t row) const;
const_row_iterator cend_row(size_t row) const;
//Same for column iterators
Il problema è che non mi è chiaro quale comportamento sia intuitivo per la maggior parte degli utenti. Il mio istinto è che un "Row Iterator" itera "all'interno" della riga, cioè,
auto begin = mat.begin_row(1);
auto end = mat.end_row(1);
for(; begin < end; ++begin) *begin = 5.f;//Fills the second row with the value 5.
Tuttavia, mi viene in mente che alcuni utenti potrebbero aspettarsi un "Row Iterator" per iterare "attraverso" le righe, cioè
auto begin = mat.begin_row(1);
auto end = mat.end_row(1);
for(; begin < end; ++begin) *begin = 5.f;//Fills the second column with the value 5.
L'implementazione di entrambe le versioni di questo codice è (teoricamente) banale, ma quale comportamento sembra più intuitivo per un utente medio? C'è un design migliore che eviti questa ambiguità?