有可能有一个向量指向其他向量的子集吗?

时间:2018-10-23 00:29:48

标签: c++ class vector s

我正在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和标量值,以及运算符()重载,使我可以就地修改或访问特定的矩阵元素,即{{1 }};上面的row方法返回行数据的副本,尽管效率低下,但从访问角度来看是可行的。我还有一个float& operator()(int _r, int _c),它修改了整行,但是想知道是否还有另一种方法。

1 个答案:

答案 0 :(得分:3)

由于您的课程是2D矩阵,因此您可能希望能够返回向量数据的子集,而该子集不一定是向量中的顺序范围。例如,您可能希望返回矩阵的单个列,即使它看起来是以行优先顺序存储的,也可能要返回矩阵的对角线元素。如果是这种情况,则注释中给出的解决方案(建议将指针返回到矢量数据中或返回一对迭代器)将不起作用,因为您需要排除由指定的范围内的某些元素这些值。

如果是这种情况,您可以做的一件事就是返回int的向量,这些向量是矩阵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

显然,您可以对该设计进行很多改进,但希望您能明白这一点。