在双for循环中使用迭代器的最佳方法是什么.对于单循环,显而易见的方式似乎是:
arma::vec test = arma::ones(10); for(arma::vec::iterator i = test.begin(); i != test.end(); ++i){ int one = *i; }
所以我想改变以下内容:
arma::mat test = arma::ones(10,10); for (int i = 0; i < test.n_rows; i++){ for (int j = 0; j < test.n_cols; j++){ int one = test(i,j); } }
使用迭代器而不是整数索引.谢谢你的建议.
当访问矩阵中的元素时,建议仍然使用单个循环.Armadillo以列主格式存储数据(为了与LAPACK兼容),因此迭代器将沿着矩阵中的每一列传播.
arma::mat A(4, 5, arma::fill::randu); A.print("A:"); // C++98 arma::mat::iterator it_end = A.end(); for(arma::mat::iterator it = A.begin(); it != it_end; ++it) { std::cout << (*it) << std::endl; } // C++11 for(const auto& val : A) { std::cout << val << std::endl; }
如果你真的想使用双循环,请使用.begin_col()和.end_col():
// C++11 for(arma::uword c=0; c < A.n_cols; ++c) { auto it_end = A.end_col(c); for(auto it = A.begin_col(c); it != it_end; ++it) { std::cout << (*it) << std::endl; } }
最后,.for_each()函数是使用迭代器的替代方法:
// C++11 A.for_each( [](arma::mat::elem_type& val) { std::cout << val << std::endl; } );