0

我如何将std::random_shuffle算法与 a 一起应用std::queue?我试过这个:

std::random_shuffle(myQueue.front(), myQueue.back());

并给出错误:

  • '__i- __first' 中的 'operator-' 不匹配
  • '__first != __last' 中的 'operator!=' 不匹配
  • '__first + 1' 中的 'operator+' 不匹配
  • '++ __i' 中的 'operator++' 不匹配

我的队列正在举办Card代表扑克牌的课程。我可以理解错误来自对队列元素进行的操作所以,即使我的班级std::random_shuffle不需要一个,我也写了一个,那个错误就消失了。!= operatorCard

但是我应该如何处理其余的错误?operators +, - and ++Card班级写作是没有意义的。

4

3 回答 3

6

std::queue不是容器;它是一个容器适配器。它调整了一个序列容器以将其接口限制为简单的队列/出队操作。特别是,它不允许您(轻松地)迭代底层容器,这是std::random_shuffle需要做的。如果您不想要这些限制,请不要使用std::queue; 直接使用序列容器(例如vectordeque)。

有一些方法可以颠覆它的接口并干预底层容器,但最好选择一个合适的容器开始。

于 2012-12-11T12:16:41.333 回答
2

std::random_shuffle需要一对迭代器。此外, anstd::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);
于 2012-12-11T12:17:19.297 回答
1

std::random_shuffle需要两个迭代器,但是std::queue::front()std::queue::back()返回两个对元素的引用。std::queue不公开迭代器,它只提供一个接口来推回和弹出前端元素。如果您需要遍历集合使用std::deque(或任何标准容器)。

于 2012-12-11T12:16:48.897 回答