首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用C++11的基于范围的函数的正确方法是什么?

使用C++11的基于范围的函数的正确方法是什么?
EN

Stack Overflow用户
提问于 2013-04-10 21:19:52
回答 2查看 108K关注 0票数 231

使用C++11的基于范围的for的正确方法是什么

应该使用什么语法?for (auto elem : container)for (auto& elem : container)还是for (const auto& elem : container)?还是其他的?

EN

回答 2

Stack Overflow用户

发布于 2013-04-11 03:35:24

正确的方法总是

代码语言:javascript
复制
for(auto&& elem : container)

这将保证所有语义的保留。

票数 4
EN

Stack Overflow用户

发布于 2017-12-12 15:10:21

虽然range-for循环的最初动机可能是易于迭代容器的元素,但其语法足够通用,即使对于不是纯粹容器的对象也是有用的。

for循环的语法要求是range_expression支持begin()end()作为函数--或者作为它计算的类型的成员函数,或者作为接受该类型实例的非成员函数。

作为一个人为设计的示例,您可以生成一个数字范围,并使用以下类在该范围内迭代。

代码语言:javascript
复制
struct Range
{
   struct Iterator
   {
      Iterator(int v, int s) : val(v), step(s) {}

      int operator*() const
      {
         return val;
      }

      Iterator& operator++()
      {
         val += step;
         return *this;
      }

      bool operator!=(Iterator const& rhs) const
      {
         return (this->val < rhs.val);
      }

      int val;
      int step;
   };

   Range(int l, int h, int s=1) : low(l), high(h), step(s) {}

   Iterator begin() const
   {
      return Iterator(low, step);
   }

   Iterator end() const
   {
      return Iterator(high, 1);
   }

   int low, high, step;
}; 

使用下面的main函数,

代码语言:javascript
复制
#include <iostream>

int main()
{
   Range r1(1, 10);
   for ( auto item : r1 )
   {
      std::cout << item << " ";
   }
   std::cout << std::endl;

   Range r2(1, 20, 2);
   for ( auto item : r2 )
   {
      std::cout << item << " ";
   }
   std::cout << std::endl;

   Range r3(1, 20, 3);
   for ( auto item : r3 )
   {
      std::cout << item << " ";
   }
   std::cout << std::endl;
}

将会得到以下输出。

代码语言:javascript
复制
1 2 3 4 5 6 7 8 9 
1 3 5 7 9 11 13 15 17 19 
1 4 7 10 13 16 19 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15927033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档