我有一个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
答案 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_shuffle
或std::shuffle
,输入类型必须满足以下要求:
RandomIt必须满足ValueSwappable和LegacyRandomAccessIterator的要求。
std::stack
甚至没有迭代器类型,更不用说满足上述要求的迭代器类型了。
如果您不得不处理将std::stack
的内容改组的任务,则可以:
std::vector
。std::vector
的内容。std::vector
的内容复制到堆栈中。