范围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++ ...
随机推荐
- [转]Windows与Linux系统下的库文件介绍
什么是库 库文件是一些预先编译好的函数的集合,那些函数都是按照可再使用的原则编写的.它们通常由一组互相关联的用来完成某项常见工作的函数构成,从本质上来说库是一种可执行代码的二进制形式,可以被操作系 ...
- 提升PHP速度的53个建议
1.如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍. 2.$row[’id’] 的速度是$row[id]的7倍. 3.echo 比 print 快,并且使用e ...
- AFC项目开发文档整理
AFC项目开发文档整理 PHPCMS 的确是一个伟大的CMS,我对它爱不释手. 标签嵌套无法loop获取的解决办法.关键代码如下: /\*后台添加\*/ $str = preg_replace ( & ...
- Python新手学习基础之数据类型——数字类型
创建一组数字 Python 的有以下几种内置数字类型: int,整型,比如:1.-2.598: float,浮点型,比如:0.0.-3.5.18.55: bool,布尔型,即True和False两个关 ...
- github三大步骤
1)git init : 初始化当前目录,把这个目录变成Git可以管理的目录 2)git add [文件名称]: 把文件添加到仓库 3)git commit -m "对当前提交文件的描述& ...
- 宏汇编软件MASM51的使用
单片机开发可以用手工汇编和机器汇编两种方法.采用手工汇编就是先编写出汇编程序,然后对照单片机汇编表手工将汇编程序翻译成机器码,最后将机器码一个一个地送入开发仿真器的RAM中去进行调试. 由于采用手工汇 ...
- C# 插入排序算法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- (转)Android’s HTTP Clients
转载自:http://android-developers.blogspot.com/2011/09/androids-http-clients.html Most network-connected ...
- STM32F051 IAP源代码分享
STM32F051 IAP源代码分享 假设不懂IAP的请自己主动脑补或者怒戳这里 http://www.openedv.com/posts/list/11494.htm 然后STM32F051的IAP ...
- Android开发(20)--RadioGroup的使用
RadioGroup 有时候比較实用.主要特征是给用户提供多选一机制. MainActivity.java package com.example.lesson16_radio; import and ...