2

重複の可能性:
C ++ STL:STLコンテナでの反復のどの方法が優れていますか?

現在のプロジェクトでは、ポインターのSTLDequeがあります。また、それらのポインターが指しているすべてのオブジェクトを削除することを目的としたメソッドもあります。これを実現するために2つの異なる方法を考え出しましたが、どちらが好ましい方法かを判断できません。

方法1。

for (deque<MyType*>::const_iterator it = myDeque.begin(); it != myDeque.end(); ++it)
{
    delete *it;
}

myDeque.clear();

方法2。

for (int i = 0; i < myDeque.size(); ++i)
{
    delete myDeque[i];
}

myDeque.clear();

これらの方法は両方とも機能するはずですが、どちらが好ましいでしょうか?方法1はSTLを使用しますが、方法2の方がはるかに簡単です。コードのクリーンさ以外に、一方のメソッドをもう一方のメソッドよりも使用する必要がある理由はありますか?このシナリオでイテレータを使用することに少しのオーバーヘッドがあるにもかかわらず、イテレータを使用することに利点はありますか?

注:この質問は、Dequesだけでなく、他のSTLシーケンスコンテナーにも当てはまります。

4

3 に答える 3

2

ポインターのコレクションを本当に使用する必要がない限り、オブジェクトのコレクションを使用するだけで完了です。

ポインターのコレクションが本当に必要な場合は、Boostポインター コンテナーのようなものを使用して、ポインティング アイテムの削除を自動化することをお勧めします。

于 2012-04-29T03:26:52.327 に答える
1

インクリメントはランダム アクセスよりも効率的であるため、1 の方が効率的であると言えます。ランダム アクセスでは、必要な定数を取得して完全な加算を行う必要がありますが、インクリメントは多くの場合、ハードウェアで非常に効率的に実装されます。

もちろん、イテレータの初期化にはコストがかかるため、イテレータがより効率的になる要素の数にはしきい値がありますが、その数はかなり低いと予想されます。

于 2012-04-29T00:59:15.347 に答える
1

これら2つの方法に違いがあるかどうかはわかりませんが、これを使用します:

std::vector<boost::shared_ptr<MyType*> > vec
于 2012-04-29T00:59:30.103 に答える