在C ++ 11中迭代容器的推荐方法是什么?

时间:2012-01-09 12:07:41

标签: c++ algorithm stl c++11

在C ++ 11中迭代容器的推荐方法是什么?

使用

container.begin() and container.end()

或者

begin(container) and end(container)

如果有的话,何时优先于另一个?

2 个答案:

答案 0 :(得分:37)

我认为range based for loops

的新语法
 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());