用于迭代顺序集合的习语

时间:2013-01-19 05:46:24

标签: c++ iteration

在现代C ++中,当你只需要每个元素的值时,迭代像字符串或向量这样的顺序集合的习惯用语简洁而优雅:

for (auto x: xs)

如果你还需要索引,那就不那么优雅了:

for (size_t i = 0; i != xs.size() ++i)

......除非有一些最近的发展,我还没有赶上。 C ++ 11是否有一种首选的方法来完成后者,或者上面的内容仍然很好?

3 个答案:

答案 0 :(得分:2)

Range-Based for loops在现代代码中非常受欢迎,Range-Based for Loops 适用于支持范围概念的任何类型。给定类型为T的对象obj,begin(obj)end(obj)有效。 包括:

  • 所有C ++ 11库容器。
  • 阵列和valarrays。
  • 初始化列表。
  • 正则表达式匹配。
  • 任何UDT(用户定义类型)T,其中begin(T)和end(T)产生合适的迭代器。

答案 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++;
}