2013-05-07 27 views
32

私は、0〜5000の要素でベクトルを日常的に埋め込むコードを用意しています。私は、最大で5000の代わりにベクトルを複数回初期化する、私は再びベクトルを埋めるために、しかし一度だけベクトルを消去または消去するC++の最速の方法

vector<struct> myvector; 
myvector.reserve(5000); 

をしたいと思っ超えることはありません知っている、私はその容量を変更することなく、第1のベクトルをクリアする必要があります。だから、通常私はmyvector.clear()を呼び出します。

これはO(n)操作です。私はこれのパフォーマンスを上げるために何か簡単なことがあるのですか、それともこれが得られる最高のものなのでしょうか?

+2

既存の要素に妥当な解決策を割り当てていますか? –

+0

いいえ、最初に5000個の要素があり、次回に3500個の要素があり、末尾に1500個の古い要素が残っているので... – user788171

+0

要素の「破壊」は問題ですか? –

答えて

38

あなたの構造体が自明ではないデストラクタを持っている場合、それは空になる方法にかかわらずベクトルのすべての要素に対して呼び出される必要があります。構造体に些細なデストラクタしかない場合は、コンパイラまたは標準ライブラリの実装で破棄処理を最適化し、O(1)操作を行うことができます。

+0

"コンパイラはおそらく最適化されます..." *と* "実装には違いがありますコストを最適化して... "(@DavidRodríguez-dribeasが答えたように)。後者は私にとってより合理的に聞こえる! – Nawaz

+0

@Nawaz:それは本当だと思います。私の意図は、「ほとんどのコンパイラがこの最適化を実行するので、それらのコンパイラの1つを使用している可能性が高い」という行に沿ったものでしたが、「コンパイラが時にはコンパイラによって最適化されないことがありますこれは、しかし、通常それは "。 –

+0

あなたは私のコメントを理解していないと思います。 "最適化されたライブラリコードの可能性"に加えて、 "コンパイラが最適化する可能性が高い"というアイデアも含まれているため、*実装はコストを最適化することができます。つまり、コンパイラ自体が最適化を行っていないとしても、ライブラリは 'value_type'が些細なデストラクタ(@DavidRodríguez-dribeasも意味するものです)があるとき' O(1) 'コードを出力するように書くことができます。彼のコメント)。 – Nawaz

10

既存のアイテムをベクターから削除するには、破壊される各アイテムのデストラクタを(潜在的に)呼び出す必要があります。したがって、コンテナの観点から、あなたが望むことができる最良のものは線形の複雑さです。

これは、ベクトルにどのような種類のアイテムを格納するかの問題だけを残します。コンパイラが呼び出すデストラクタを事前に知っている/知っているかもしれないintのようなものを保存すると、削除が一定の複雑さで終わる可能性は少なくともかなりあります。

しかし、構文を変更すると(例えば、resize()erase(begin(), end()))、大きな違いはありません。この構文は、N個のデストラクタを呼び出す(スレッドがない場合)O(N)操作であるという事実を変えない。

23

clear()のコストは、格納されたオブジェクトが何であるか、特にそれらが些細なデストラクタを持っているかどうかに大きく依存します。型に些細なデストラクタがない場合、呼び出しはすべての格納されたオブジェクトを破棄しなければならず、実際にはO(n)操作ですが、実際には何もできません。

保存された要素に些細なデストラクタがある場合、実装ではコストを最適化でき、clear()は格安O(1)操作(ちょうどサイズをリセットする-endポインタ)になります。

漸近的な複雑さを理解するには、それが何を話しているかを知る必要があることを忘れないでください。 clear()の場合、それは呼び出されるデストラクタの数を表しますが、コスト(隠された)が0の場合、操作はノーオペレーションです。

+0

些細なデストラクタの意味を明確にすることはできますか?私はこの用語に慣れていない。 – user788171

+8

私はこの文脈で「些細なデストラクタ」は「デストラクタなし」と同じだと思います。 –

+4

@ user788171:この「全体的ではない」ものが何であるかを理解するために、[集約とPODとは何ですか、そしてそれらはどうして特別なのですか?](http://stackoverflow.com/a/7189821/2070725) (ちょっと下をスクロールして "些細な"部分に到達する) – syam

関連する問題