【发布时间】:2021-07-10 12:17:16
【问题描述】:
我正在尝试让一个基本的常量前向迭代器在 C++ 中工作。
namespace Rcpp {
class SparseMatrix {
public:
IntegerVector i, p;
NumericVector x;
int begin_col(int j) { return p[j]; };
int end_col(int j) { return p[j + 1]; };
class iterator {
public:
int index;
iterator(SparseMatrix& g) : parent(g) {}
iterator(int ind) { index = ind; }; // ERROR!
bool operator!=(int x) const { return index != x; };
iterator operator++(int) { ++index; return (*this); };
int row() { return parent.i[index]; };
double value() { return parent.x[index]; };
private:
SparseMatrix& parent;
};
};
}
我的意图是在类似于以下的上下文中使用迭代器:
// sum of values in column 7
Rcpp::SparseMatrix A(nrow, ncol, fill::random);
double sum = 0;
for(Rcpp::SparseMatrix::iterator it = A.begin_col(7); it != A.end_col(7); it++)
sum += it.value();
两个问题:
- 编译器在上面指出的行中抛出错误:
uninitialized reference member in 'class Rcpp::SparseMatrix&' [-fpermissive]。如何解决这个问题? - 如何重新设计
double value() { return parent.x[index]; };以返回指向该值的指针而不是该值的副本?
SparseMatrix 类的一些上下文:就像 R 中的 dgCMatrix,SparseMatrix 类的对象由三个向量组成:
-
i保存x中每个元素的行指针 -
p在i中给出索引,对应于每列的开头 -
x包含非零值
【问题讨论】:
-
您希望
iterator(int ind) { index = ind; };做什么?它是一个构造函数,它应该初始化parent。也许你需要iterator(SparseMatrix&, int)ctor 之类的东西? -
@Evg 谢谢,
iterator(dgCMatrix& g, int ind) : parent(g) { index = ind;}编译,我现在检查是否可行。 -
还有什么问题?迭代器总是必须知道它所迭代的矩阵。
-
begin_col和end_col应该返回一个迭代器,而不是int。 -
对于
value(),您可以使用double& value()。还要注意operator++应该返回iterator&,而不是iterator。
标签: c++ iterator sparse-matrix const-iterator