2011-09-20 60 views
3

我在將輸出對齊到終端時遇到了很多麻煩。我想打印一個矢量向量,例如vector< vector<double> > myvec;到myvec [i]佔據終端上第i行的輸出。組成myvec的矢量的大小爲3使用C++將輸出對齊到終端

這是我試圖打印它的方式。

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

+0

使用製表符(\ t)的代替空格 「」 列之間。 –

+0

我們真的需要一個物理截圖嗎? –

回答

6

您可以使用setw()設置寫入你想要的最少字符數,left輸出數據到左側。就像這樣:

cout << setw(8) << left << myvec[i][0]; 

這應該填補的空白與空間,但如果沒有,那麼你可以這樣做:

cout << setw(8) << left << setfill(' ') << myvec[i][0]; 

您需要#include <iomanip>這一點。

+0

非常感謝!這對我來說很好。其中一個問題是setw()的工作。說myvec [i] [0]的值爲2.71828,我做'cout << setw(3)<< left << myvec [i] [0];'這是否意味着只打印2.7輸出? – smilingbuddha

+0

@GaurishTelang編號'setw()'設置要寫入的*最小*字符數。 – quasiverse

+0

任何命令可以設置要寫入的最大字符數? – smilingbuddha

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告訴編譯器,使elem同一類型什麼myvec.begin()回報。另一C++ 11方式,不太可能被支持的,是range-based for loop

for(auto elem: myvec)