Возможно ли иметь вектор, указывающий на подмножество другого вектора? - PullRequest
0 голосов
/ 23 октября 2018

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

1 Ответ

0 голосов
/ 23 октября 2018

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

Если это так, одну вещь, которую вы можете сделать, это вернуть вектор 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

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

...