使用C ++将输出对齐到终端

时间:2011-09-20 01:35:37

标签: c++ terminal

我在输出到终端时遇到了很多麻烦。我想在输出中打印向量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)

enter image description here

2 个答案:

答案 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];

2-D载体

您宣布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告诉编译器使elemmyvec.begin()返回的类型相同。另一种不太可能受支持的C ++ 11方式是range-based for loop

for(auto elem: myvec)