C++基于范围的for循环:for(auto a:b)

C++基于范围的for循环

范围for(range for)语句遍历给定序列中的每个元素并对序列中的每个值执行某种操作,其语法形式是:

   1. for (declaration : expression)
   2.     statement

其中:
expression部分是一个对象,必须是一个序列,比方说用花括号括起来的初始值列表、数组或者vector或string等类型的对象。这些类型的共同特点是拥有能返回迭代器的begin和end成员
declaration 部分负责定义一个变量,该变量将被用于访问序列中的基础元素。每次迭代,declaration部分的变量会被初始化为expression部分的下一个元素值。确保类型相容最简单的办法是使用auto类型说明符

虽然我们通常称new T [ ]分配的内存为“动态数组”,但是要记住我们所说的动态数组并不是数组类型,这是很重要的。当用new分配一个数组时,我们并未得到一个数组类型的对象,而是得到一个数组元素类型的指针。由于分配的内存并不是一个数组类型,因此不能对动态数组调用begin或end。出于相同的原因,也不能用范围for语句来处理动态数组中的元素。

Example 1

使用范围for语句和ispunct函数来统计string对象中标点符号的个数:

其中ispunct()函数是判断字符是否为标点符号的函数,使用需包含cctype头文件

size_t cntPunct(string s) {
    decltype(s.size()) punct_cnt = 0; // punct_cnt 的类型和s.size()的返回类型一样
    for (auto c : s)
        if (ispunct(s))
            ++punct_cnt;

    return punct_cnt;
}

Example 2

如果想要改变expression对象中的值,必须把循环变量定义成引用类型。使用这个引用,我们就可以改变它绑定的元素。

将字符串改写为大写字母,其中toupper()函数是将小写字母转换为大写字母函数,使用需包含cctype头文件

void string_toupper(string &s) {
    for (auto &c : s)
        c = toupper(c);
}

Example 3

如果我们既想用引用,又不想改变原始值,那么可以用const 引用

打印字符串:

void string_print(string &s) {
    for (const auto &c : s)
        std::cout << c << " ";
}

参考文献:

《C++ Primer(第五版)》

————————————————
版权声明:本文为CSDN博主「chfe910」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chfe007/article/details/44047285

总结for(auto a:b)用法:

  1. b的第一个和最后一个元素就是a的范围。
  2. 可以对STL标准模板库中(如:vector,set,list,map,queue,deque,string等)的各种容器使用“基于范围的for循环”
  3. 若想对自己定义的类使用这种语法,类中必须**定义begin、end函数(不能是Begin和End这样的函数)和重载前++、==、!= 和解引用*操作符。**

补充一点

范围for语句for(auto& r:v)的定义等价于:

for(auto beg = v.begin() , end = v.end() ; beg != end ; ++beg){
	auto &r = *beg;
}

可以看到,在范围for里面,总是预存了v.end()的值,所以,-一旦在范围for里面添加(删除)序列v的元素,获取的end值就变得无效了,这一点很重要。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值