范围for语句:

引入的意义:简化传统for的编写,主要用于遍历给定序列中的每个元素并对序列中的每个值执行某种操作,其语法形式是:

for( 声明: 给定序列)

{

执行的操作。

}

其中,“给定序列”部分是一个对象,如一个string的对象。“声明”部分用于定义一个变量,该变量将被用于访问序列中的基础元素。每次迭代,“声明”部分的变量会被初始化为“给定序列”部分的下一个元素值。

一个范围for循环的简单例子:

 string str(“some string”);
2 for(auto c:str)
3   cout << c << endl;

范围for将变量c和str联系起来。str中的字符,每经历一次迭代,就顺序的赋值一个字符给c变量。执行的操作是将变量c输出,这样就输出了str的整个值。

“声明”部分,也可以是引用,如:

 string str(“some string”);
for(auto &c:str)
c = toupper(c);
cout << str << endl;

对声明部分的c使用引用,从而可以修改str的值,这里在范围for中将str全部大写。

可以尝试使用传统的while和for语句改写,会发现范围for更加简单明了。

列表初始值还是元素数量:

C++11标准引入了{}初始化集合,下面我们总结一下()和{}初始化vector对象的区别。

 vector<int> v1();     //v1有10个元素,每个的值都是0。
vector<int> v2{ }; //v2有1个元素,该元素的值是10。
vector<int> v3(, ); //v3有10个元素,每个的值都是1。
vector<int> v4{ , }; //v4有2个元素,值分别是10和1。

如果用圆括号,可以说提供的值是用来构造(construct)vector对象的,圆括号内的值不全是初始化对象元素的初始值。一般生成具有多个相同数据元素的集合。

如果用花括号,可以表述成我们想列表初始化(list initialize)该vector对象。也就是说,初始化过程会尽可能把花括号内的值当成集合中元素的初始值来处理。

另一方面,当花括号内的值不能执行列表初始化,编译器会尝试使用构造vector对象,即这个时候花括号和圆括号的功能一样,如示例v7,v8的初始化:

 vector<string> v5{ "hi" };      //列表初始化,v5有一个元素。
vector<string> v6("hi"); //错误:不能用字符串字面值构建vector对象。
vector<string> v7{ }; //v7有10个默认初始化的元素。因为10不是string类型,不能列表初始化该对象。
vector<string> v8{ , "hi" }; //v8有10个值为"hi"的元素。

标准库函数begin和end:

C++在遍历数组时,很容易出错,为了让指针的使用更简单、安全。C++11新引入了两个名为begin和end的函数。这两个函数与vector容器中的两个同名方法功能类似。不过数组毕竟不是类类型,因此这两个函数不是成员函数。正确的使用形式是将数组作为它们的参数:

 int ia[] = { ,,,,,-,,,, };
int *beg = begin(ia); //指向ia首元素的指针。
int *last = end(ia); //指向ia尾元素的下一个位置的指针。

使用begin和end可以很容易地写出一个循环并处理数组中的元素。例如:

 //寻找第一个负值元素。
while (beg != last && *beg >= )
++beg;

另外,还可以使用数组的指针来初始化vector:

 int int_arr[] = { , , , , ,  };
//ivec有6个元素,分别使int_arr中对应元素的副本
vector<int> ivec(begin(int_arr), end(int_arr));

范围for语句 && 列表初始值&& 标准库函数begin和end的更多相关文章

  1. 标准库函数begin和end------c++primer

    尽管能计算得到尾后指针,但这种用法极易出错.为了让指针的使用更简单.更安全,c++新标准引入了两个名为begin和end的函数.这两个函数与容器中的两个同名成员功能类似,不过数组毕竟不是类类型,因此这 ...

  2. 深度探索C++对象模型之第二章:构造函数语意学之成员初始值列表

    当我们需要设置class member的初值时,要么是经过member initialization list ,要么在construcotr内. 一.先讨论必须使用member initializa ...

  3. C#3.0新特性:隐式类型、扩展方法、自动实现属性,对象/集合初始值设定、匿名类型、Lambda,Linq,表达式树、可选参数与命名参数

    一.隐式类型var 从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,编译器自动推断类型. 1.var类型的局部变量必须赋予初始值,包括匿名 ...

  4. 74个Swift标准库函数

    74个Swift标准库函数 本文译自 Swift Standard Library: Documented and undocumented built-in functions in the Swi ...

  5. [SAP ABAP开发技术总结]初始值、空、NULL、INITIAL等问题

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  6. 你好,C++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11)

    3.5.2  字符串类型 使用char类型的变量我们可以表示单个字符,那么,我们又该如何表示拥有多个字符的字符串呢? 我们注意到,一个字符串是由多个字符串连起来形成的.很自然地,一种最简单直接的方法就 ...

  7. C/C++语言的标准库函数malloc/free与运算符new/delete的区别

    概括地说 1.malloc与free是C++/C的标准库函数,new/delete是C++的运算符,它们都可用于申请动态内存和释放内存. 2.对于非内部数据类型的对象而言,只用malloc/free无 ...

  8. 【iOS】swift 74个Swift标准库函数

    本文译自 Swift Standard Library: Documented and undocumented built-in functions in the Swift standard li ...

  9. C++/C语言的标准库函数与运算符的区别new/delete malloc/free

    malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存.下面来看他们的区别. 一.操作对象有所不同 malloc与free是C++ ...

随机推荐

  1. JavaScript中var a=b=c=d的小发现

    看了别人的博客随手记录下 先看一下以下的代码 var a=1,b=2,c=3; (function(){ var a=b=1; })(); console.log(a); console.log(b) ...

  2. ECSTORE导航吸顶功能

    ecstore导航吸顶功能,在导航父元素中加入id,如: <div id="mainNav1"></div> 在footer.html中添加以下js代码: ...

  3. Android高清巨图加载方案

    1.今天看了鸿洋的<Android高清巨图加载方案>一文,对加载高清巨图时的解决方案有了一定的认识. 思路为: 提供一个设置图片的入口. 重写onTouchEvent,在里面根据用户移动的 ...

  4. flex

    http://www.w3.org/html/ig/zh/wiki/Css3-flexbox https://developer.mozilla.org/zh-CN/docs/CSS/CSS_Refe ...

  5. Codeforces 461B Appleman and Tree

    http://codeforces.com/problemset/problem/461/B 思路:dp,dp[i][0]代表这个联通块没有黑点的方案数,dp[i][1]代表有一个黑点的方案数 转移: ...

  6. poj2068--Nim

    题意:给你2n个人,两方各n个人,交叉坐,每个人可以取的石子有一个最大限制,总共有S颗石子,哪一方取了最后一颗石子就输了,问先取石子的这一方是否有必胜策略. DP,dp[i][j]代表第i个人还有J个 ...

  7. LeetCode_Unique Paths

    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...

  8. Qt浅谈之二十七进程间通信之QtDBus

    一.简介 DBus的出现,使得Linux进程间通信更加便捷,不仅可以和用户空间应用程序进行通信,而且还可以和内核的程序进行通信,DBus使得Linux变得更加智能,更加具有交互性.        DB ...

  9. 前端模拟发送数据-Chrome下的REST Client

    1)确定需要POST的数据 2)拼接数据,POST给服务器 3)查看服务器响应及结果

  10. 【转】使用 vim + ctags + cscope + taglist 阅读源码

    原文网址:http://my.oschina.net/u/554995/blog/59927 最近,准备跟学长一起往 linux kernel 的门里瞧瞧里面的世界,虽然我们知道门就在那,但我们还得找 ...