STL - 在<algorithm>?</algorithm>中使用成员函数或函数

时间:2010-11-11 09:10:42

标签: c++ stl

由于我遇到以下问题的一些答案,我想到了这个问题,这表明我可以vector<T>::assigncopy使用back_insert_iterator here.我的问题是,使用一种方法比另一种方法有什么缺点和优点?

5 个答案:

答案 0 :(得分:5)

assign会覆盖vector的内容copy,其中back_insert_iteratorpush_back执行{{1}},从而预先确定其内容。

编辑:如果问题是通用的(即是否使用容器中定义的成员函数或算法),我更喜欢使用成员函数,因为它可能已针对特定问题进行了优化容器与通用算法相比。

答案 1 :(得分:2)

补充Naveen's answer,使用std::copy()也更加通用,因为这样您就可以轻松地写入任何输出迭代器。这可能是一个流或完全自定义的东西。

答案 2 :(得分:2)

在一般情况下,更喜欢成员函数到功能等效的算法。 Scott Meyers在Effective STL中深入讨论了这一点。

答案 3 :(得分:1)

从本质上讲,它们是相同的。 Vector的重新分配行为(根据其与push_back的行为方式定义)通过逐步使用更多内存来避免过多的重新分配。

如果您需要相同的代码来处理多种容器类型(即您正在编写模板),包括那些不在stdlib中的容器,那么通常更喜欢自由函数。

如果您不介意在容器类型发生变化时重写此代码,那么您可以prematurely optimize(如果您愿意),或者只是使用更方便的方式。

为了完整起见,copy + back_inserter相当于end :: insert在end(),而vector :: clear + copy + back_inserter相当于vector :: assign。

答案 4 :(得分:1)

您的问题可以概括如下:

  

处理STL容器时,   我应该更喜欢使用会员吗?   功能或独立功能   来自<algorithm>当有功能等价物时?

询问10位程序员,你会得到12个回复。但他们落入了两个主要阵营:

1)首选成员函数。它们是针对相关容器定制设计的,并且效率高于<algorithm>等效容器。

2)更喜欢独立功能。它们更通用,更容易维护它们。

最终,你必须自己决定。在给出一些合理的,研究过的思想后,你得出的任何结论都比盲目地跟随别人的建议要好。

但是如果你只是想盲目地听从别人的建议,那就是我的:更喜欢独立的功能。是的,它们可能比成员函数慢。而“慢”就是这么脏的词。但是10次中有9次你没有(或者不应该)关心一种方法比另一种更有效。大多数情况下,当您需要一个集合时,您将定期添加一些元素,执行某些操作,然后完成。有时您需要超高性能查找,插入或删除,但通常不需要。因此,如果您要使用“首选方法X”方法进入一侧或另一侧,则应针对通用情况进行调整。而倾向于成员方法的方法似乎倾向于优化 - 我称之为过早的微优化。