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

C++ 什么';这是在C+中迭代容器的推荐方法+;11?,c++,algorithm,stl,c++11,C++,Algorithm,Stl,C++11,在C++11中迭代容器的推荐方法是什么 使用 或 如果有的话,什么时候一种方法比另一种更可取 begin(container) end(container) 因为它更具可扩展性。例如,模板参数推断可用于确定静态数组的大小,因此开始(my_static_array)和结束(my_static_array)将起作用 更一般地说,您可以添加重载/专门化来开始(.)结束(.)并在泛型算法中使用不可变的遗留类型 如果你正在自己编写一个通用算法,你真的只需要担心这个问题 template <type

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

使用

如果有的话,什么时候一种方法比另一种更可取

begin(container)
end(container)
因为它更具可扩展性。例如,模板参数推断可用于确定静态数组的大小,因此
开始(my_static_array)
结束(my_static_array)
将起作用

更一般地说,您可以添加重载/专门化来开始(.)结束(.)并在泛型算法中使用不可变的遗留类型

如果你正在自己编写一个通用算法,你真的只需要担心这个问题

template <typename T>
void foo (T & t)
{
    bar (begin(t), end(t)); // certainly better than bar(t.begin(), t.end())
}

我认为新的语法

可能是最像C++11的


正如其他人评论的那样,有时您需要
auto&
const auto&
而不是
auto

@Basile:我同意,但VS10还不支持,所以我还没有玩过它。:)@斯普拉夫:同意,但这个问题(有意地?)含糊不清,我的答案很合适!我会将这些项目作为参考:
auto&item:container
,以避免不必要的副本。@Johann:那么如果你想要VS10支持,你就不需要C++11了。@spraff:我不同意,这个标题说的是在容器上迭代,基于范围的for循环肯定会在容器上迭代,同时保护您免受任何其他循环可能遭受的许多微小错误的影响。OP提供的代码示例实际上并不涉及迭代容器(更多的是从容器中获取迭代器…),但问题仍然存在。您的示例与迭代本身无关。这是关于如何从作为容器模型的类的对象中获取迭代器的问题。目前还没有足够的经验来推荐这种方法。新的for语法和begin/end-free函数有其优点,但经验可能会告诉你一些缺点(我不期望有,但我没有期望大部分经验教训,即使我期望有一些)。为什么要在这里引用迭代器?如果要启用对数组的迭代,您必须编写
std::begin(t)
std::end(t)
,或者必须使用std::begin编写
使用std::end
作为函数中的前两条语句(有点像使用std::swap的
习惯用法)。@spraff:作为推荐的习惯用法,我希望在
for
循环的
第一条语句中“缓存”c.end()
的结果,而不是在每次迭代中计算它。@MatthieuM。,或者我可以让编译器担心微观优化,而拒绝用噪音来修饰我的答案。@spraff:我的想法是你不知道这是否是微观优化。如果
end
调用无法内联,并且编译器无法证明其纯度(非常罕见…),则不会执行优化。
begin(container)
end(container)
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());
 for (auto item : container)