关于您的代码的几点说明:
对齐类型
quasiverse 的答案为您提供左对齐,即每个数字都从第一个字符位置开始。删除left 使其右对齐,即每个数字都从最后一个字符位置开始。
对齐小数点有点困难。如果要设置小数点后的固定位数,请将left 替换为fixed 并添加setprecision(),为其指定小数点后的位数。例如,显示小数点后两位数:
cout << setw(8) << fixed << setprecision(2) << myvec[i][0];
二维向量
您声明了vector< vector<double> > myvec;,但次要(第二)维度似乎硬编码为 3。这意味着您正在创建一个向量向量,其中每一行都是一个完整的向量对象,存储三个双精度值。
vectors 不在内部存储他们的数据;实际的向量对象只存储元素的数量、指向实际数据存储的指针,也许还有其他一些东西。实际数据存储在单独的块中。这会产生大量开销和内存碎片(每行分配一个块来存储数据)。
例如,对于一个 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)