c++ - 何时使用 std::begin 和 std::end 而不是容器特定版本

标签 c++ c++11

是否有任何一般偏好或规则来解释何时应使用容器特定版本的 begin 和 end 来代替自由函数 std::beginstd::end ?

我的理解是,如果函数是一个模板,而容器类型是一个模板参数,那么应该使用 std::beginstd::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() 是首选?

我是否正确假设通过调用 cont.end() 而不是 std::end(cont) 对性能没有好处?

最佳答案

自由函数版本比容器的成员函数更通用。我可能会在通用代码中使用它,其中容器的类型事先不知道(并且可能是一个数组)。在其余代码中(即当容器固定且已知时),由于惯性,我可能会使用 c.begin() 。我希望有关 C++ 的新教科书会推荐免费函数版本(因为它永远不会更糟,有时会更好),但这必须 catch 常见用法。

关于c++ - 何时使用 std::begin 和 std::end 而不是容器特定版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8452130/

相关文章:

c++ - 使用指针会导致内存堵塞吗?

c++ - 赋予容器其子代的所有权,但让子代使用智能指针存储对其父代的引用

c++ - 链接未引用的库会破坏我的程序

c++ - C++ 中的 Functor 永远不能抽象吗?

C++ 原子和跨线程可见性

c++ - emplace_back 调用移动构造函数和析构函数

c++ - vector 中的删除方法

c++ - 实现可变类型特征

c++ - GCC 和 clang 之间的 constexpr 差异

c++ - 异常后清理