我正在学习如何使用迭代器,但我无法概念化如何使用它们从双循环构造向量.
这是一个例子:假设我想编写一个输入两个向量的函数,并输出通过组合每个向量中的单个元素生成的所有可能和的向量(这是一个人为的例子).这是一个工作版本:
#includeusing namespace Rcpp; // [[Rcpp::depends(RcppArmadillo)]] // [[Rcpp::export]] arma::colvec test(arma::colvec x, arma::colvec y) { arma::colvec out(x.size()*y.size()); arma::colvec::iterator ix,iy; int count=0; for (ix=x.begin();ix!=x.end();ix++) { for (iy=y.begin();iy!=y.end();iy++) { out(count)=*ix+*iy; count+=1; } } return out; } /*** R test(c(1:15),c(15:1)) */
这工作正常,但我觉得使用count
作为out矢量的ad-hoc迭代器似乎不优雅,我觉得必须有一个更好的解决方案.我希望这样的东西能起作用:
arma::colvec::iterator ix,iy,io; for (ix=x.begin(),io=out.begin();ix!=x.end(),io!=out.end();ix++,io++) { for (iy=y.begin();iy!=y.end();iy++,io++) { *io=*ix+*iy; } }
这会导致我的计算机崩溃,所以我猜我无法对io
每个循环进行迭代.如果有人能指出在这种情况下的良好做法,我将非常感激.
问候
io++
每次嵌套循环结束时,你连续做两次.这会使你的迭代器更快地移动,最终超出范围.但也ix
超出了范围.
io++
从外循环的迭代表达式中删除.那么它将相当于:
*(io++) = *ix + *iy;
没有其他增量io
.
现在,请注意循环条件中的逗号运算符(这是导致崩溃的原因):
ix != x.end(), io != out.end()
- 评估ix != x.end()
,丢弃其值,使用值io != out.end()
.应该有逻辑AND(&&
)代替.如果,你应该检查io != out.end()
嵌套循环的条件(这是io
增加的地方).
但是既然你out
是这样构建的:
arma::colvec out(x.size() * y.size());
没有支票就安全了.
代码(C++ 11):
auto io = out.begin(); for (auto x_elem : x) for (auto y_elem : y) *(io++) = x_elem + y_elem;