今天在写STL的时候,关于一个计算维度的函数始终不成,我就各种输出debug,结果发现了自己对输出流的一个遗漏点
template <typename T>
size_t vector<T>::n_dim() {
cout << typeid(*this).name() << endl;
return 0;
}
这是出问题的函数,return 0是因为我暂时得出的不是正确的dim值,我就把功能删了,直接返回0保证运行。
下面是我的test函数
#include "vector.hpp"
void test() {
vector<int> vec_1;
vector<int> vec_2(10);
vector<int> vec_3(10, 2);
vector<vector<int>> vec_4(10, vector<int>(10, 0));
for(int i = 0; i < vec_1.size(); ++i) {
cout << vec_1[i];
} cout << endl << endl;
for(int i = 0; i < vec_2.size(); ++i) {
cout << vec_2[i];
} cout << endl << endl;
for(int i = 0; i < vec_3.size(); ++i) {
cout << vec_3[i];
} cout << endl << endl;
for(int i = 0; i < vec_4.size(); i++) {
for(int j = 0; j < vec_4[0].size(); j++) {
cout << vec_4[i][j];
} cout << endl;
} cout << endl;
cout << "1: " << vec_1.n_dim() << endl
<< "2: " << vec_2.n_dim() << endl
<< "3: " << vec_3.n_dim() << endl
<< "4: " << vec_4.n_dim() << endl << endl;
cout << "1: " << vec_1.n_dim() << '\n'
<< "2: " << vec_2.n_dim() << '\n'
<< "3: " << vec_3.n_dim() << '\n'
<< "4: " << vec_4.n_dim() << '\n' << endl;
cout << "1: " << vec_1.n_dim() << endl;
cout << "2: " << vec_2.n_dim() << endl;
cout << "3: " << vec_3.n_dim() << endl;
cout << "4: " << vec_4.n_dim() << endl << endl;
cout << typeid(vec_4).name() << endl
<< typeid(vec_4[0]).name() << endl
<< typeid(vec_4[0][0]).name() << endl;
cout << "1: " << sizeof(vec_1) << endl
<< "2: " << sizeof(vec_2) << endl
<< "3: " << sizeof(vec_3) << endl
<< "4: " << sizeof(vec_4) << endl;
}
问题就在中间连续调用n_dim的2串代码中。
cout << "1: " << vec_1.n_dim() << endl
<< "2: " << vec_2.n_dim() << endl
<< "3: " << vec_3.n_dim() << endl
<< "4: " << vec_4.n_dim() << endl << endl;
cout << "1: " << vec_1.n_dim() << '\n'
<< "2: " << vec_2.n_dim() << '\n'
<< "3: " << vec_3.n_dim() << '\n'
<< "4: " << vec_4.n_dim() << '\n' << endl;
输出情况如黑框,为什么vec_4的类型输出跑到了最上面?
为了检查我就写了下面一段代码
cout << "1: " << vec_1.n_dim() << endl;
cout << "2: " << vec_2.n_dim() << endl;
cout << "3: " << vec_3.n_dim() << endl;
cout << "4: " << vec_4.n_dim() << endl << endl;
cout << typeid(vec_4).name() << endl
<< typeid(vec_4[0]).name() << endl
<< typeid(vec_4[0][0]).name() << endl;
输出如下:
没问题啊…………
仔细思考,感觉应该是cout在一个流的时候,其实ostream对象存入的输出信息也是一个栈区,保证了栈结构的先进后出的原则。vec_1 —> vec_4的类型判断信息按顺序进入,暂存在ostream对象的一个用于暂存的栈空间内部,随后又按照先进后出的原则输出,因此会造成这种逆序输出的情况。