我写了一个打印功能如下。
#define NDEBUG
void print(vector<int> &vec)
{
#ifdef NDEBUG
std::cout << "vector size: " << vec.size() << std::endl;
#endif
if (!vec.empty())
{
auto temp = vec.back();
vec.pop_back();
print(vec);
std::cout << temp<<std::endl;
}
}
打印:
vector sise:6
vector sise:5
vector sise:4
vector sise:3
vector sise:2
vector sise:1
vector sise:0
1
2
3
4
5
6
但我希望它类似于:
vector sise:6
6
vector sise:5
5
vector sise:4
4
vector sise:3
3
vector sise:2
2
vector sise:1
1
vector sise:0
是因为线程的优先级?如果是,我如何控制正确的执行顺序作为我的代码?
答案 0 :(得分:3)
<强>解决方案强>
以下几行被颠倒了:
print(vec);
std::cout << temp<<std::endl;
他们应该是:
std::cout << temp<<std::endl;
print(vec);
<强>原理强>
如果在输入向量大小为6时查看代码,则首先输出大小:
std::cout << "vector size: " << vec.size() << std::endl;
然后你会递归地调用你的函数:
print(vec);
只有在这个递归调用返回后才打印第6项:
std::cout << temp<<std::endl;
然后你从你的功能返回。所以很明显,第6个项目将打印到最后。相同的推理适用于递归调用并解释您的输出。
答案 1 :(得分:3)
在输出print
之前递归调用temp
。可以这样想(用一个小例子):
print vec(2)
cout size: 2
print vec(1)
cout size: 1
print vec(0)
cout size: 0
cout 1
cout 2
你需要在递归之前输出:
std::cout << temp << std::endl;
print(vec);