带有std :: queue的std :: random_shuffle

时间:2012-12-11 12:09:55

标签: c++ collections queue std shuffle

如何将std::random_shuffle算法应用于std::queue?我试过这个:

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

并给出错误:

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

我的队列中有Card个类,代表扑克牌。我可以理解错误来自于std::random_shuffle正在对队列元素进行的操作所以,即使我不需要!= operator我的Card类,我写了一个和那个错误消失了。

但是我应该怎么处理其余的错误?为operators +, - and ++类编写Card是没有意义的。

3 个答案:

答案 0 :(得分:6)

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

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(或任何标准容器)。