2012-04-29 179 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

相关问题