将std :: stack复制到std :: vector中

Arm*_*yan 12 c++ stack stl vector

标准是否保证以下代码可以工作(假设st不为空)?

#include <vector>
#include <stack>
int main()
{
   extern std::stack<int, std::vector<int> > st;
   int* end   = &st.top() + 1;
   int* begin = end - st.size();
   std::vector<int> stack_contents(begin, end);
}
Run Code Online (Sandbox Code Playgroud)

ron*_*nag 9

是.

std::stack 只是一个容器适配器.

你可以看到它.top()实际上是(§23.3.5.3.1)

reference top() { return c.back(); }
Run Code Online (Sandbox Code Playgroud)

c容器在哪里,在这种情况下是一个std::vector

这意味着您的代码基本上被翻译成:

   extern std::vector<int> st;
   int* end   = &st.back() + 1;
   int* begin = end - st.size();
   std::vector<int> stack_contents(begin, end);
Run Code Online (Sandbox Code Playgroud)

并且std::vector保证是连续的,应该没有问题.

但是,这并不意味着这是一个好主意.如果你需要使用这样的"黑客",它通常是糟糕设计的一个指标.你可能想std::vector从头开始使用.

  • 这是一个好奇的问题...不是真正的代码:) (2认同)

Dan*_*röm 5

只有std::vectorC++ 03才能保证有连续的元素(23.4.1).在C++ 1x中,这也将扩展到std::string(缺陷#530).

  • 哇,我从来不知道字符串没有这样的保证。有趣,谢谢。Upvoting,虽然这与我的问题无关 (2认同)