2012-04-29 50 views
2

可能重複:
C++ STL: Which method of iteration over a STL container is better?清除指針的最佳方法是什麼?

在我當前的項目,我有一個指針的STL deque的。我也有一個方法來刪除這些指針指向的所有對象。我已經想出了兩種不同的方法來實現這一點,但我無法確定哪種方法是首選方法。

方法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要簡單得多。除了代碼清潔之外,是否有任何理由說明爲什麼一種方法應該用於其他方法?在這種情況下使用迭代器是否有優勢,儘管創建它的開銷很小?

注意:這個問題適用於其他STL序列容器,而不僅僅是Deques。

+0

在這種特殊情況下,使用智能指針將是首選解決方案。 – dasblinkenlight 2012-04-29 00:58:27

+0

如下所述,第一個可能更有效。但是要避免重複調用end()(和size()):for(deque :: const_iterator it = myDeque.begin(),endit = myDeque.end(); it!= endit; ++它) – 2012-04-29 04:53:14

+0

@Anon - 與'delete'調用相比,您在此嘗試的任何本地優化都可能是噪聲。 – 2012-04-29 06:19:35

回答

1

我會說1更有效率,因爲遞增比隨機訪問更有效率。隨機訪問需要檢索必要的常量並進行全加操作,而增量操作通常在硬件中非常有效地實現。

但是當然,初始化一個迭代器需要花費一些東西,所以在迭代器變得更高效的元素數量上存在一個閾值,但是我認爲這個數字相當低。除非你真的需要使用指針的集合,只是使用對象的集合

std::vector<boost::shared_ptr<MyType*> > vec 
+0

我同意這個答案,我應該說如果你希望代碼更加簡潔,你可以使用auto關鍵字。 – 2012-04-29 01:13:09

+1

這裏的實際成本將是'delete'。相比之下,迭代成本將接近於零。 – 2012-04-29 06:22:01

1

我不知道是否有這兩種方法有什麼區別, 但我會用這並完成它。

如果你確實需要一個指針集合,那麼你可能想要使用像Boost pointer container這樣的東西來自動刪除指針對象。

+0

@波佩爾森謝謝你 – 2015-07-06 01:32:17

2

相關問題