c++ - 现在如何在 C++11 中编写 for 循环?

标签 c++ c++11

现在如何在 C++11 中编写 for 循环?

for (int i{0}; i < 10; ++i) {}

我现在就是这样做的。注意两件事:

 1. int i{0} instead of int i = 0
 2. prefix increment

为什么我不应该使用 {} 进行初始化?

最佳答案

编写 for 循环的方法比您的理念中想到的要多。

for( auto i = 0; i < 10; ++i ) {}

无缘无故地使用了一个额外的字符。有:

for( int i{}; i < 10; ++i ) {}

这是非常波浪形的。

有经典的:

for( int i = 0; i < 10; ++i ) {}

同样有效。我喜欢的有趣方式是:

for( const int i : boost::counting_range(0, 10) ) {}

或一些自制版本的boost::counting_range(0,10) .使它有用的一个可爱的方法是写:

template<typename C>
boost::counting_range<std::size_t> indexes( C const& c ) {
  return {0, c.size()};
}
template<typename T, std::size_t N>
boost::counting_range<std::size_t> indexes( T(&)[N] ) {
  return {0, N};
}

它允许您通过以下方式迭代容器的索引:

for( const auto i : indexes( container ) ) {
  container[i] = i+1;
}

而且我发现它非常漂亮。

但是,您通常不需要索引,除非您对多个随机访问容器进行并行迭代。一系列 boost zip 迭代器可以让您在多个容器(随机或非随机)上进行并行迭代,只要您完成处理结束条件问题的工作即可。

有趣的是,你可以破解 indexes无法在非随机访问容器上工作(通过测试 [std::declval<std::size_t>()] 来查看它是否是一个有效的表达式),但在关联容器上迭代键。非常像 python。

关于c++ - 现在如何在 C++11 中编写 for 循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21534850/

相关文章:

c++ - C++11 标准中的哪一部分规定了原始数据类型大小之间的相对顺序?

c++ - 在 C++03 中是否可以使用非 const 右值引用?

c++ - std::fstream 缓冲与手动缓冲(为什么手动缓冲有 10 倍增益)?

c++ - 如何使用动态调整大小的字符串数组?

c++ - c++中运算符的地址

python - SDL: "working natively in C++"是什么意思?

c++ - 常量表达式中引用类型的变量

c++ - 未知 EABI 对象属性 44

c++ - 这是什么 (( ))?

c++ - Poco 1.5.2 C++ ODBC 在插入时抛出异常