Joh*_*ell 26 c++ algorithm stl c++11
在C++ 11中迭代容器的推荐方法是什么?
运用
container.begin() and container.end()
Run Code Online (Sandbox Code Playgroud)
要么
begin(container) and end(container)
Run Code Online (Sandbox Code Playgroud)
如果有的话,何时优先于另一个?
Bas*_*tch 37
我认为新的语法与范围基于循环
for (auto item : container)
Run Code Online (Sandbox Code Playgroud)
可能是最喜欢的C++ 11.
正如其他人评论的那样,你有时想要auto&
或 const auto&
代替auto
.
spr*_*aff 24
更好的方法是
begin(container)
end(container)
Run Code Online (Sandbox Code Playgroud)
因为它更具可扩展性.例如,模板参数推导可用于确定一个静态数组的大小并因此begin(my_static_array)
而end(my_static_array)
将工作.
更一般地,您可以添加重载/特化以开始(.)end(.)并在通用算法中使用不可变遗留类型.
如果你自己编写通用算法,你真的只需要担心这个问题
template <typename T>
void foo (T & t)
{
bar (begin(t), end(t)); // certainly better than bar(t.begin(), t.end())
}
Run Code Online (Sandbox Code Playgroud)
在客户端代码中,它并不重要.事实上,我会说在这种情况下不要使用新形式 - 我喜欢在某些情况下保留某些风格/习语,划分我的心态.但那只是我.
for (auto i = c.begin(); i != c.end(); ++i)
// I can see at-a-glance that c is a STL-style container.
// That might be useful to know. I can probably dismiss static arrays
// and unorthodox containers as possibilities.
foo (i, c.size());
Run Code Online (Sandbox Code Playgroud)