2016-10-23 2 views
7

私はページという名前のC++スタックを持っています。どうすればスタックをC++で効率的にクリアできますか?

stack<string> pages; 
//here is some operation 
//now clearing the stack 
while(!pages.empty()) 
    pages.pop(); 

今、私の質問:私は、スタックをクリアする明確な()関数を持っていないので は、私は次のコードを書いたスタックをクリアする優れた効率的な方法はありますか? ありがとうございます。

+5

スタックに空のスタックを割り当ててみましたか? – krzaq

+0

いいえ、ご意見ありがとうございます(y) –

+0

ありがとうございました。 –

答えて

12

一般に、コピーを破棄する必要があるため、O(1)のコピーコンテナをクリアすることはできません。テンプレート化されたコピーコンテナが、O(1)の時間にクリアされた部分的な特殊化を持つことが考えられます。これは、包含されたオブジェクトの型が些細なデストラクタを持つことを示す特性によってトリガされました。

ループを回避したい場合。

pages=stack<std::string>(); 

または

stack<std::string>().swap(pages); 
8

私は、より効率的な方法があるとは思いません。スタックは明確に定義されたデータ型であり、特にLIFOコンテキストで動作するように設計されており、一度に空にすることはできません。 vectorまたはdeque(またはlist)を使用できます。これらは基本的に基本となるコンテナです。実際にはstackはコンテナアダプタです。詳細はC++ Referenceをご覧ください。

選択肢がなく、スタックを使用する必要がある場合は、その方法に間違いはありません。いずれにしても、新しい空のスタックを割り当てても、すべての要素をポップしても、何でも、要素が構築されていれば、要素を破壊する必要があります。

代わりにvectorを使用することをお勧めします。それはあなたが本当に必要な事業を展開しています:

  • サイズ(またはサイズ変更)
  • 一back
  • pop_back
  • バック
  • 明らか

それはちょうどより便利です、clearメソッドを使用することができます。 vectorを使用するのが本当にパフォーマンスが良いかどうかはわかりません。スタック操作は基本的に同じです。

関連する問題