相关疑难解决方法(0)

为什么在C++ 11中使用非成员开始和结束函数?

每个标准容器具有beginend方法,返回的迭代器是容器.然而,C++ 11显然已经引入自由函数调用std::beginstd::end该调用beginend成员函数.所以,而不是写作

auto i = v.begin();
auto e = v.end();
Run Code Online (Sandbox Code Playgroud)

你会写的

using std::begin;
using std::end;
auto i = begin(v);
auto e = end(v);
Run Code Online (Sandbox Code Playgroud)

在他的演讲中,编写现代C++,Herb Sutter说当你想要容器的开始或结束迭代器时,你应该总是使用自由函数.但是,他没有详细说明你想要的原因.查看代码,它可以为您节省一个字符.因此,就标准容器而言,自由函数似乎完全没用.Herb Sutter表示非标准容器有好处,但他再次没有详细说明.

因此,问题是除了调用相应的成员函数版本之外,自由函数版本究竟做了什么,std::begin并且std::end做了什么,为什么要使用它们呢?

c++ iterator stl c++11 container-data-type

185
推荐指数
6
解决办法
3万
查看次数

何时使用std :: begin和std :: 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 */ );
}
Run Code Online (Sandbox Code Playgroud)

在其他场景中,例如已知容器类型的标准/成员函数呢?它仍然是更好的做法是使用std::begin(cont)std::end(cont)或应容器的成员函数cont.begin()cont.end()首选?

我在假设有通过调用在性能上没有任何好处纠正cont.end()std::end(cont)

c++ c++11

89
推荐指数
3
解决办法
2万
查看次数

C++ 中的 `sort(str.begin(), str.end())` 和 `sort(std::begin(str), std::end(str))` 有什么区别?或者它们是相同的吗?如果是,为什么?

sort(str.begin(), str.end())using和 C++ 中的 using有什么区别sort(std::begin(str), std::end(str))

这两个函数给出的结果与排序后的字符串相同,但是两者之间有什么区别吗?两者都有的原因是什么?

c++ iterator stl c++14

3
推荐指数
2
解决办法
414
查看次数

标签 统计

c++ ×3

c++11 ×2

iterator ×2

stl ×2

c++14 ×1

container-data-type ×1