在C ++ 11中迭代容器的推荐方法是什么?
使用
container.begin() and container.end()
或者
begin(container) and end(container)
如果有的话,何时优先于另一个?
答案 0 :(得分:37)
for (auto item : container)
可能是最喜欢的C ++ 11。
正如其他人所说,您有时需要auto&
或const auto&
而不是auto
。
答案 1 :(得分:24)
更好的方法是
begin(container)
end(container)
因为它更具可扩展性。例如,模板参数推导可用于确定静态数组的大小,因此begin(my_static_array)
和end(my_static_array)
将起作用。
更一般地说,您可以添加重载/特化以开始(。)结束(。)并在通用算法中使用不可变遗留类型。
如果你自己编写通用算法,你真的只需要担心这个问题
template <typename T>
void foo (T & t)
{
bar (begin(t), end(t)); // certainly better than bar(t.begin(), t.end())
}
在客户端代码中,它并不重要。事实上,在这种情况下,我会说不使用新形式 - 我喜欢在某些情况下保留某些风格/习语,划分我的思维模式。但那只是我。
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());