Я пишу двумерную обертку вокруг std::vector
и хотел бы, чтобы член возвращал вектор, указывающий на подмножество вектора данных класса, например,
class matrix2D{
// ...
int nR, nC;
std::vector<float> data;
// ...
}
std::vector<float> matrix2D::row(int row){
return std::vector(data.begin()+row*nCols,data.begin()+row*nCols+nCols);
}
РЕДАКТИРОВАТЬ: Я был в основном заинтересован в этом для того, чтобы иметь возможность изменить всю строку (и столбец, а также) на месте, например. mat.row(r) = std::vector<float> (nR, 0.0)
;
Я написал перегрузки операторов, которые позволяют мне поэлементно суммировать два объекта matrix2D или matrix2D и скалярное значение, а также перегрузку operator (), которая позволяет мне изменять или получать доступ к конкретному элементу матрицы на месте, т.е. float& operator()(int _r, int _c)
; Вышеуказанный метод строки возвращает копию данных строки, и, хотя и неэффективно, работает с точки зрения доступа. У меня также есть void setRow(std::vector<float> _row)
это изменяет всю строку, но было интересно, если есть альтернативный путь.
Поскольку ваш класс представляет собой двумерную матрицу, вы можете захотеть вернуть подмножество векторных данных, которое не обязательно является последовательным диапазоном в векторе. Например, вы можете захотеть вернуть один столбец матрицы, даже если кажется, что вы храните его в главном порядке строк, или вы можете захотеть вернуть диагональные элементы матрицы. В этом случае решения, приведенные в комментариях (которые предлагают возвращать указатель на векторные данные или возвращать пару итераторов), не будут работать, поскольку вам нужно будет исключить определенные элементы из диапазона, указанного в эти ценности.
Если это так, то вы могли бы вернуть вектор int
s, которые являются показателями в матрице data
вектор. Этот вектор индексов будет тем, что вы ищете: подмножество, которое не обязательно появляется последовательно в data
вектор.
Вы могли бы перегрузить matrix2D
оператор индекса для принятия такой коллекции и возврата специального временного типа с семантикой присваивания для подмножества matrix2D
так что вы можете написать код:
int main(int argc, char **argv) {
matrix2d matrix4x4(4, 4);
std::vector<float> values(4, 1);
auto first_column = matrix4x4.first_column();
matrix4x4[first_column] = values;
matrix4x4.print();
// output is:
// 1 0 0 0
// 1 0 0 0
// 1 0 0 0
// 1 0 0 0
}
Таким образом, вы можете не только получить доступ к подмножествам значений в матрице, но и изменить подмножество.
Вот быстрая реализация этой идеи, которая должна продемонстрировать приведенный выше пример: https://ideone.com/j5DfBg
Очевидно, вы могли бы сделать много улучшений в этом дизайне, но, надеюсь, вы поняли суть.
Других решений пока нет …