我喜欢Boost Spirit Karma用于这些小型格式化/生成器任务。
直接方法
如果你不介意在每行后面加上制表符
Live On Coliru
matrix m1(4, 5);
std::fill(m1.data().begin(), m1.data().end(), 1);
using namespace boost::spirit::karma;
std::ofstream("file.txt") << format_delimited(columns(m1.size2()) [auto_], '\t', m1.data()) << "\n";
打印
1.0 â 1.0 â 1.0 â 1.0 â 1.0 â
1.0 â 1.0 â 1.0 â 1.0 â 1.0 â
1.0 â 1.0 â 1.0 â 1.0 â 1.0 â
1.0 â 1.0 â 1.0 â 1.0 â 1.0 â
使用
multi_array
看法
使用
const_multi_array_ref
适配器作为原始存储的“视图”:
Live On Coliru
std::ofstream("file.txt") << format(auto_ % '\t' % eol,
boost::const_multi_array_ref<float, 2>(&*m1.data().begin(), boost::extents[4][5]));
这会产生相同的结果,但每行上没有尾随选项卡:
1.0 â 1.0 â 1.0 â 1.0 â 1.0
1.0 â 1.0 â 1.0 â 1.0 â 1.0
1.0 â 1.0 â 1.0 â 1.0 â 1.0
1.0 â 1.0 â 1.0 â 1.0 â 1.0
使现代化
使用helper函数使其可读性更强,不易出错:
template <typename T> boost::const_multi_array_ref<T, 2> make_view(boost::numeric::ublas::matrix<T> const& m) {
return boost::const_multi_array_ref<T,2> (
&*m.data().begin(),
boost::extents[m.size1()][m.size2()]
);
}
所以它变得公正
Live On Coliru
std::cout << format(auto_ % '\t' % eol, make_view(m1)) << "\n";
哪个是
非常优雅
,在我看来
笔记
当然,这些都采用行主要布局。