范围for语句 && 列表初始值&& 标准库函数begin和end
范围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的更多相关文章
- 标准库函数begin和end------c++primer
尽管能计算得到尾后指针,但这种用法极易出错.为了让指针的使用更简单.更安全,c++新标准引入了两个名为begin和end的函数.这两个函数与容器中的两个同名成员功能类似,不过数组毕竟不是类类型,因此这 ...
- 深度探索C++对象模型之第二章:构造函数语意学之成员初始值列表
当我们需要设置class member的初值时,要么是经过member initialization list ,要么在construcotr内. 一.先讨论必须使用member initializa ...
- C#3.0新特性:隐式类型、扩展方法、自动实现属性,对象/集合初始值设定、匿名类型、Lambda,Linq,表达式树、可选参数与命名参数
一.隐式类型var 从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,编译器自动推断类型. 1.var类型的局部变量必须赋予初始值,包括匿名 ...
- 74个Swift标准库函数
74个Swift标准库函数 本文译自 Swift Standard Library: Documented and undocumented built-in functions in the Swi ...
- [SAP ABAP开发技术总结]初始值、空、NULL、INITIAL等问题
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 你好,C++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11)
3.5.2 字符串类型 使用char类型的变量我们可以表示单个字符,那么,我们又该如何表示拥有多个字符的字符串呢? 我们注意到,一个字符串是由多个字符串连起来形成的.很自然地,一种最简单直接的方法就 ...
- C/C++语言的标准库函数malloc/free与运算符new/delete的区别
概括地说 1.malloc与free是C++/C的标准库函数,new/delete是C++的运算符,它们都可用于申请动态内存和释放内存. 2.对于非内部数据类型的对象而言,只用malloc/free无 ...
- 【iOS】swift 74个Swift标准库函数
本文译自 Swift Standard Library: Documented and undocumented built-in functions in the Swift standard li ...
- C++/C语言的标准库函数与运算符的区别new/delete malloc/free
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存.下面来看他们的区别. 一.操作对象有所不同 malloc与free是C++ ...
随机推荐
- (转)yum 和 apt-get 用法及区别
原地址:http://www.cnblogs.com/adforce/archive/2013/04/12/3017577.html 一般来说著名的linux系统基本上分两大类: 1 RedHat系 ...
- web标准(复习)--8
今天我们开始学习下拉及多级弹出菜单,包含以下内容和知识点: 带下拉子菜单的导航菜单 绝对定位和浮动的区别和运用 css自适应宽度滑动门菜单 一.带下拉子菜单的导航菜单下拉菜单在一些企业网站应用尤为广泛 ...
- Flask学习记录之Flask-Mail
Flask-Mail可以连接到配置中的SMTP服务器,进行邮件发送,如果没有进行SMTP服务器的配置,将会默认连接到localhost上的 一.配置及初始化 (1)flask应用配置 #配置选项 MA ...
- FJ省队集训DAY1 T1
题意:有一堆兔子,还有一个r为半径的圆,要求找到最大集合满足这个集合里的兔子两两连边的直线不经过圆. 思路:发现如果有两个点之间连边不经过圆,那么他们到圆的切线会构成一段区间,那么这两个点的区间一定会 ...
- ISO7816通讯协议在工控主板EM9160中的实现方案
在新的国家电网智能终端相关标准中,规定了通过专门的加密芯片来保证设备数据安全性的方法,而设备主控单元与加密芯片采用了广泛应用的ISO7816通讯协议.工控主板EM9160为了适应这一新的技术需求,对其 ...
- Android Studio 设置LogCat 颜色
1. File -> Settings ->Search LogCat 2. Save a schema first, for instance: MyLogCatStyle 3. cho ...
- 单元测试之C/C++
如今TDD很火,我公司小,一般写代码不写测试用例的,一般就是随便测试下函数的输入输出,没用工具或框架来测试,非常简单,一点也不正规化. 在一种传统的结构化编程语言中,比如C,要进行测试的单元一般是函数 ...
- cache buffers chains latch
cache buffers chains latch 从 Oracle 8i Database 开始, 散列锁存器<-------(1:m)------>hash bucket<-- ...
- Linux企业级项目实践之网络爬虫(13)——处理user-agent
User Agent即用户代理,是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA.它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本.操作系统及版本.浏览 ...
- poj3641:伪素数检测
知道miller robin 素数测试中的伪素数定义就可以很容易解决,详见总结帖 #include <iostream> #include<stdio.h> #include& ...