如何在C ++中随机播放std :: stack?

时间:2019-04-25 02:28:16

标签: c++ stack c++14 shuffle

我有一个STL堆栈,其中包含指向对象的指针。如何调整堆栈中项目的顺序?我可以使用算法库,还是需要编写自己的算法来做到这一点?

我已经能够找到有关如何对内置数组和STL向量进行改组的详细信息,但是我却无法找到对STL堆栈进行改组的方法。

#include <stack>

stack <Card*> mystack;
// [code to fill stack with pointers is here, but has been omitted as irrelevant]

// function call to shuffle the stack should go here

2 个答案:

答案 0 :(得分:3)

这显示了您可以绕过C ++中的访问控制并直接随机播放std::stack的基础容器的一种方法。几乎可以肯定这不是您分配任务的重点...

using stack_c_ptr_t = std::deque<Card*> std::stack<Card*>::*;

constexpr stack_c_ptr_t stack_c_ptr();

template<stack_c_ptr_t p>
struct hack {
    friend constexpr stack_c_ptr_t stack_c_ptr() { return p; }
};

template struct hack<&std::stack<Card*>::c>;

void shuffle_stack_hack(std::stack<Card*>& mystack) {
   auto& c = mystack.*stack_c_ptr();
   std::random_device rd;
   std::shuffle(c.begin(), c.end(), rd); // because I'm too lazy to properly seed a PRNG with rd
}

答案 1 :(得分:0)

要使用std::random_shufflestd::shuffle,输入类型必须满足以下要求:

  

RandomIt必须满足ValueSwappableLegacyRandomAccessIterator的要求。

std::stack甚至没有迭代器类型,更不用说满足上述要求的迭代器类型了。

如果您不得不处理将std::stack的内容改组的任务,则可以:

  1. 将内容复制到std::vector
  2. 随机播放std::vector的内容。
  3. std::vector的内容复制到堆栈中。