Возможно ли иметь вектор, указывающий на подмножество другого вектора?

Я пишу двумерную обертку вокруг 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) это изменяет всю строку, но было интересно, если есть альтернативный путь.

0

Решение

Поскольку ваш класс представляет собой двумерную матрицу, вы можете захотеть вернуть подмножество векторных данных, которое не обязательно является последовательным диапазоном в векторе. Например, вы можете захотеть вернуть один столбец матрицы, даже если кажется, что вы храните его в главном порядке строк, или вы можете захотеть вернуть диагональные элементы матрицы. В этом случае решения, приведенные в комментариях (которые предлагают возвращать указатель на векторные данные или возвращать пару итераторов), не будут работать, поскольку вам нужно будет исключить определенные элементы из диапазона, указанного в эти ценности.

Если это так, то вы могли бы вернуть вектор ints, которые являются показателями в матрице 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

Очевидно, вы могли бы сделать много улучшений в этом дизайне, но, надеюсь, вы поняли суть.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]