相关疑难解决方法(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万
查看次数

通过using-directive调用begin和end?

已经确定的调用习惯swap是:

using std::swap
swap(foo, bar);
Run Code Online (Sandbox Code Playgroud)

这样,swap可以为std命名空间之外的用户定义类型重载.

我们应该调用begin,并end以同样的方式?

using std::begin;
using std::end;
some_algorithm(begin(some_container), end(some_container));
Run Code Online (Sandbox Code Playgroud)

或者我们应该写:

some_algorithm(std::begin(some_container), std::end(some_container));
Run Code Online (Sandbox Code Playgroud)

c++ stl using-directives argument-dependent-lookup c++11

16
推荐指数
2
解决办法
626
查看次数