23

clear()std::queue、std::stack、および std::priority_queue がメンバー関数を提供しない理由を知っている人はいますか? 私はこのようなものを偽造する必要があります:

std::queue<int> q;
// time passes...
q = std::queue<int>();  // equivalent to clear()

IIRCclear()は、基になるコンテナーとして機能するすべてのものによって提供されます。コンテナ アダプタで提供しない正当な理由はありますか?

4

6 に答える 6

19

clearこれは、キュー、priority_queue、またはスタック (ちなみに、deque はアダプターではなくコンテナー) に対する有効な操作と見なされなかったことが原因だと思います。

コンテナー deque の代わりにコンテナー アダプター キューを使用する唯一の理由は、キュー操作のみを実行し、他の操作を実行しないことを明確にするためです。(キューのsgiページから)

したがって、キューを使用する場合、できることは要素をプッシュ/ポップすることだけです。キューをクリアすることは、FIFO の概念に違反していると見なすことができます。したがって、キューをクリアする必要がある場合は、実際にはキューではない可能性があり、deque を使用することをお勧めします。

しかし、この考え方は少し偏狭で、キューをクリアするだけで十分だと思います。

于 2009-01-29T22:57:36.167 に答える
11

Deque には clear() があります。たとえば、http://www.cplusplus.com/reference/stl/deque/clear.htmlを参照してください。

ただし、キューはそうではありません。しかし、とにかく、なぜ deque よりも queue を選ぶのでしょうか?

コンテナー deque の代わりにコンテナー アダプター キューを使用する唯一の理由は、キュー操作のみを実行し、他の操作を実行しないことを明確にするためです。

( http://www.sgi.com/tech/stl/queue.html )

したがって、 clear() はキュー操作ではないと思います。

于 2009-01-29T22:48:41.100 に答える
2

コンテナ アダプタはコンテナではないからだと思います。

于 2009-01-29T22:56:07.700 に答える
1

継承している限り、キュー (および std::stack と priority_queue) をクリアできます。これを可能にするために、コンテナーは意図的に保護されたままになっています。

#include <queue>

using namespace std;

class clearable_queue : public queue<int>
{
public:
  void clear()
    {
      // the container 'c' in queues is intentionally left protected
      c.clear();
    }
};   

int main(int argc, char** argv)
{
  clearable_queue a;
  a.clear();
}
于 2009-01-29T22:59:33.370 に答える
-1

それは実装に依存すると思います - 最近まで、Microsoft STL はいくつかのコンテナについて明確にしていませんでした。(現在はそうです。たとえば、この簡単なGoogleの結果

ただし、clear() は単に erase(begin(), end()) の呼び出しであることが多いため、独自の同等のものを実装して代わりに使用してください。

標準では、イテレータ範囲で消去することをクリアと呼んでいると思うので、上記はほとんどの実装が提供するものです。(例: Dinkumware の)

于 2009-01-29T22:46:05.490 に答える
-2

std::queue、std::deque、および std::priority_queue はコンテナー アダプターであり、基になるコンテナーにアクセスするための少数のメソッドのみを提供します。

アクセスできる限り、基になるコンテナーをクリアできます。これを行うには、基礎となるコンテナーを作成して、apapptor コンストラクターに渡します。例えば:

std::deque< int > d;
std::queue< int > q( d );

... time passes ...

d.clear();

編集:追加情報

また、基になるコンテナーでメソッドを呼び出すと、アダプターによって行われた仮定が破られる可能性があるため、ここでは慎重に検討するように警告する必要がありました。その点で、現在キューをクリアしている方法が望ましいようです。

于 2009-01-29T22:58:32.373 に答える