在现代C ++中,当你只需要每个元素的值时,迭代像字符串或向量这样的顺序集合的习惯用语简洁而优雅:
for (auto x: xs)
如果你还需要索引,那就不那么优雅了:
for (size_t i = 0; i != xs.size() ++i)
......除非有一些最近的发展,我还没有赶上。 C ++ 11是否有一种首选的方法来完成后者,或者上面的内容仍然很好?
答案 0 :(得分:2)
Range-Based for loops
在现代代码中非常受欢迎,Range-Based for Loops
适用于支持范围概念的任何类型。给定类型为T的对象obj,begin(obj)
和end(obj)
有效。
包括:
答案 1 :(得分:1)
首选和惯用的方法是简单的for循环。
替代方法包括使用整数范围:
template<typename C>
auto container_index(C const& container) -> decltype(boost::irange(0, container.size())) {
return boost::irange(0, container.size());
}
for(auto x : container_index(xs))
或迭代函数:
template<typename F>
void index_iterate(std::size_t size, F func) {
for(std::size_t i = 0; i != size; ++i) {
func(i);
}
}
index_iterate(container.size(), [&](std::size_t i){ /* ... */ });
尽可能使用简单的循环。在我看来这是优越的。
答案 2 :(得分:0)
您可以结合使用两种方法:
int i = 0;
for ( auto x : v ) {
// do smth with x or v[i] or i
i++;
}