如何将std::random_shuffle
算法应用于std::queue
?我试过这个:
std::random_shuffle(myQueue.front(), myQueue.back());
并给出错误:
我的队列中有Card
个类,代表扑克牌。我可以理解错误来自于std::random_shuffle
正在对队列元素进行的操作所以,即使我不需要!= operator
我的Card
类,我写了一个和那个错误消失了。
但是我应该怎么处理其余的错误?为operators +, - and ++
类编写Card
是没有意义的。
答案 0 :(得分:6)
std::queue
不是容器;它是一个容器适配器。它调整序列容器以将其接口限制为简单的队列/出列操作。特别是,它不允许您(轻松)迭代底层容器,这是std::random_shuffle
需要做的事情。如果您不想要这些限制,请不要使用std::queue
;直接使用序列容器(例如vector
或deque
)。
有ways来破坏它的界面并插入底层容器,但选择一个合适的容器会更好。
答案 1 :(得分:2)
std::random_shuffle
需要一对迭代器。此外,std::queue
并非设计为像这样混乱。它按照定义维护其元素的顺序。你可以做的是创建一个std::deque
,随机播放,并从中构造一个队列。
std::deque<int> d {5, 1, 67, 89, 32, 444}; // populate in the order you would the queue
std::random_shuffle(d.begin(), d.end());
std::queue<int> q(d);
答案 2 :(得分:1)
std::random_shuffle
需要两个迭代器,但std::queue::front()
和std::queue::back()
会返回对元素的两个引用。 std::queue
不公开迭代器,它只提供一个推回和弹出前端元素的接口。如果需要迭代集合,请使用std::deque
(或任何标准容器)。