是否有任何通用首选项或规则来解释何时应使用容器特定版本的begin和end,而不是自由函数std::begin
和std::end
我的理解是,如果函数是一个模板,容器类型是一个模板参数,那么应该使用std::begin
和std::end
,即:
template<class T> void do_stuff( const T& t )
{
std::for_each( std::begin(t), std::end(t), /* some stuff */ );
}
在其他场景中,比如标准/成员函数,容器的类型是已知的呢?使用std::begin(cont)
和std::end(cont)
是更好的做法,还是应该首选容器的成员函数cont.begin()
和cont.end()
?
假设在std::end(cont)
上调用cont.end()
对性能没有任何好处,这样的假设正确吗?
发布于 2011-12-10 07:17:01
自由函数版本比容器的成员函数更通用。我可能会在容器类型事先未知的泛型代码中使用它(可能是一个数组)。在代码的其余部分中(即当容器是固定的和已知的),由于惯性,我可能会使用c.begin()
。我希望C++上的新教科书会推荐免费函数版本(因为它从来没有变得更糟,有时甚至更好),但这必须赶上常见的用法。
发布于 2011-12-10 06:24:14
除非有一些优化被关闭以进行调试,否则使用cont.begin()
(或者指向第一个元素的指针,等等)不会带来性能上的好处,除非有人提供了一个非常奇怪的实现!几乎所有的实现(当然是那些使用STL的实现)都是非常薄的,并且在编译器的嘴里就融化了。
优点是在上面的“或任何东西”中:相同的代码可以跨不同的集合类型工作,无论是来自STL的另一个集合,还是数组,或者是由第三方提供的某个奇怪的集合(如果他们认为为它提供了begin的专门化)。即使你从来没有用过它,begin()
也是广为人知的,应该有一个熟悉的好处。
https://stackoverflow.com/questions/8452130
复制相似问题