由于我遇到以下问题的一些答案,我想到了这个问题,这表明我可以vector<T>::assign
或copy
使用back_insert_iterator
here.我的问题是,使用一种方法比另一种方法有什么缺点和优点?
答案 0 :(得分:5)
assign
会覆盖vector
的内容copy
,其中back_insert_iterator
对push_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”方法进入一侧或另一侧,则应针对通用情况进行调整。而倾向于成员方法的方法似乎倾向于优化 - 我称之为过早的微优化。