C++ std::random_使用std::queue洗牌

C++ std::random_使用std::queue洗牌,c++,collections,queue,std,shuffle,C++,Collections,Queue,Std,Shuffle,如何将std::random_shuffle算法应用于std::queue?我试过这个: std::random_shuffle(myQueue.front(), myQueue.back()); 并给出了错误: “\uuu i-\uu first”中的“operator-”不匹配 “operator!=”不匹配在‘你先!’__最后的 “\u first+1”中的“operator+”不匹配 “++”i”中的“运算符++”不匹配 我的队列中有Card类,它们代表扑克卡。我可以理解错误来自于

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

std::random_shuffle(myQueue.front(), myQueue.back());
并给出了错误:

  • “\uuu i-\uu first”中的“operator-”不匹配
  • “operator!=”不匹配在‘你先!’__最后的
  • “\u first+1”中的“operator+”不匹配
  • “++”i”中的“运算符++”不匹配
我的队列中有
Card
类,它们代表扑克卡。我可以理解错误来自于
std::random_shuffle
对队列元素执行的操作,即使我不需要
!=操作员
对于我的
类,我写了一个,错误消失了


但是我应该如何处理其余的错误呢?为
类编写
运算符+、-和++/code>是没有意义的。

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


有很多方法可以破坏它的接口并干预底层容器,但最好先选择一个合适的容器。

std::random\u shuffle
需要两个迭代器,但是
std::queue::front()
std::queue::back()
返回对元素的两个引用
std::queue
不公开迭代器,它只提供了一个用于向后推送和弹出前端元素的接口。如果需要迭代集合,请使用
std::deque
(或任何标准容器)。

std::random\u 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);
std::deque d{5,1,67,89,32,444};//按照队列中的顺序填充
std::random_shuffle(d.begin(),d.end());
std::队列q(d);

这是否必要?我的意思是,一旦我使用std::deque,使用它的pop_-front和push_-front方法不是更好吗?@romardgz如果你需要队列,最好坚持使用
std::queue
std::deque
支持队列不应该支持的所有类型的操作。好吧,我理解这个问题,但我有一个疑问:如果deque是双队列,为什么它可以有迭代器而队列不能?对我来说也是如此me@RomanRdgz:因为队列是适配器,而不是容器。它包装了一个容器(默认情况下为
deque
),并提供了一个更简单、更具体的接口。