首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >何时使用std::begin和std::end而不是容器特定的版本

何时使用std::begin和std::end而不是容器特定的版本
EN

Stack Overflow用户
提问于 2011-12-10 05:49:41
回答 2查看 27.7K关注 0票数 107

是否有任何通用首选项或规则来解释何时应使用容器特定版本的begin和end,而不是自由函数std::beginstd::end

我的理解是,如果函数是一个模板,容器类型是一个模板参数,那么应该使用std::beginstd::end,即:

代码语言:javascript
复制
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()对性能没有任何好处,这样的假设正确吗?

EN

回答 2

Stack Overflow用户

发布于 2011-12-10 07:17:01

自由函数版本比容器的成员函数更通用。我可能会在容器类型事先未知的泛型代码中使用它(可能是一个数组)。在代码的其余部分中(即当容器是固定的和已知的),由于惯性,我可能会使用c.begin()。我希望C++上的新教科书会推荐免费函数版本(因为它从来没有变得更糟,有时甚至更好),但这必须赶上常见的用法。

票数 84
EN

Stack Overflow用户

发布于 2011-12-10 06:24:14

除非有一些优化被关闭以进行调试,否则使用cont.begin() (或者指向第一个元素的指针,等等)不会带来性能上的好处,除非有人提供了一个非常奇怪的实现!几乎所有的实现(当然是那些使用STL的实现)都是非常薄的,并且在编译器的嘴里就融化了。

优点是在上面的“或任何东西”中:相同的代码可以跨不同的集合类型工作,无论是来自STL的另一个集合,还是数组,或者是由第三方提供的某个奇怪的集合(如果他们认为为它提供了begin的专门化)。即使你从来没有用过它,begin()也是广为人知的,应该有一个熟悉的好处。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8452130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档