0

どうすれば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ます。したがって、クラスにを必要としない場合でも!= operatorCardクラスを作成すると、そのエラーはなくなりました。

しかし、残りのエラーはどうすればよいですか?クラスoperators +, - and ++のために書くのは意味がありません。Card

4

3 に答える 3

6

std::queueコンテナではありません。コンテナアダプタです。シーケンスコンテナを適応させて、インターフェイスを単純なキュー/デキュー操作に制限します。特に、下にあるコンテナを(簡単に)反復することはできません。これは、std::random_shuffle実行する必要があることです。これらの制限が必要ない場合はstd::queue、;を使用しないでください。シーケンスコンテナ(vectorまたはなどdeque)を直接使用します。

そのインターフェースを破壊し、基礎となるコンテナーに干渉する方法はありますが、最初に適切なコンテナーを選択する方がはるかに優れています。

于 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_shuffle2つのイテレータが必要ですが、要素への2つの参照を返しますstd::queue::front()。イテレータを公開しません。フロント要素をプッシュバックおよびポップするためのインターフェイスのみを提供します。コレクションの使用(または標準のコンテナーのいずれか)を繰り返す必要がある場合。std::queue::back()std::queuestd::deque

于 2012-12-11T12:16:48.897 に答える