剛想代碼中的幾個注意事項:
對齊類型
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)
使用製表符(\ t)的代替空格 「」 列之間。 –
我們真的需要一個物理截圖嗎? –