我在输出到终端时遇到了很多麻烦。我想在输出中打印向量viz vector< vector<double> > myvec;
的向量,其中myvec [i]占据终端上的第i行。组成myvec
的向量大小为3
这是我尝试打印它的方式。
for(unsigned int i=0; i<myvec.size() ; ++i )
{
cout<<myvec[i][0]<<" "
<<myvec[i][1]<<" "
<<myvec[i][2]<<'\n';
}
当我打印输出时,只有myvec [i] [0]数字列正确对齐。其余数字看起来很混乱。是否有一种很好的方法来对齐此输出? (忽略图像第5行右侧打印的0.7)
答案 0 :(得分:6)
您可以使用setw()
设置要写入的最小字符数,并使用left
将数据输出到左侧。像这样:
cout << setw(8) << left << myvec[i][0];
这应该用空格填充空白区域,但如果没有,那么你可以这样做:
cout << setw(8) << left << setfill(' ') << myvec[i][0];
您需要#include <iomanip>
。
答案 1 :(得分:0)
关于代码的几点说明:
quasiverse的答案给你左对齐,即每个数字都从第一个字符位置开始。删除left
以使其正确对齐,即每个数字都从最后一个字符位置开始。
对齐小数点有点困难。如果要设置小数点后的固定位数,请将left
替换为fixed
并添加setprecision()
,并为其指定超过小数的位数。例如,要显示小数点后的两位数字:
cout << setw(8) << fixed << setprecision(2) << myvec[i][0];
您宣布vector< vector<double> > myvec;
,但次要(第二)维度显示硬编码为3.这意味着您正在创建向量向量,其中每行是一个整个向量对象,存储三个双精度。
vector
s内部不存储数据;实际的矢量对象只存储元素的数量,指向实际数据存储的指针,以及其他一些东西。实际数据存储在单独的块中。这将产生大量开销和内存碎片(每行分配一个块来存储数据)。
例如,对于1000x3向量,堆栈上有顶层向量对象,堆上有1000个向量对象(每行一个)的数组,并且每个对象指向三个双块的块,所以你在堆上有1001个对象,每个访问都需要经过两个指针。缓慢而低效。
如果长度固定,则 vector
过度杀伤。所以我建议使用一个结构向量,每个结构都有三个双重结构:
struct point {
double x, y, z;
};
vector<point> myvec;
这将所有数据存储在一个块中,因为point
完全是自包含的。然后你的代码是:
for(unsigned int i = 0; i < myvec.size() ; ++i)
{
cout << setw(8) << left << myvec[i].x << ' ' << setw(8) << left << myvec[i].y
<< ' ' << setw(8) << left << myvec[i].z << endl;
}
或者,C ++迭代器的方式:
for(vector<point>::const_iterator elem = myvec.begin(); elem != myvec.end() ; ++elem)
{
cout << setw(8) << left << elem.x << ' ' << setw(8) << left << elem.y
<< ' ' << setw(8) << left << elem.z << endl;
}
这可以节省大量operator[]
的来电。如果您的编译器支持新的C ++ 11标准,则可以将for()
行更改为:
for(auto elem = myvec.begin(); elem != myvec.end() ; ++elem)
其中auto
告诉编译器使elem
与myvec.begin()
返回的类型相同。另一种不太可能受支持的C ++ 11方式是range-based for loop:
for(auto elem: myvec)