范围for语句 && 列表初始值&& 标准库函数begin和end

范围for语句:

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

for( 声明: 给定序列)

{

执行的操作。

}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

标准库函数begin和end:

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

1 int ia[] = { 0,1,2,3,4,-5,6,7,8,9 };
2 int *beg = begin(ia);   //指向ia首元素的指针。
3 int *last = end(ia);    //指向ia尾元素的下一个位置的指针。

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

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

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

1 int int_arr[] = { 0, 1, 2, 3, 4, 5 };
2 //ivec有6个元素,分别使int_arr中对应元素的副本
3 vector<int> ivec(begin(int_arr), end(int_arr));
时间: 2024-08-01 16:24:26

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

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

尽管能计算得到尾后指针,但这种用法极易出错.为了让指针的使用更简单.更安全,c++新标准引入了两个名为begin和end的函数.这两个函数与容器中的两个同名成员功能类似,不过数组毕竟不是类类型,因此这两个函数不是成员函数.正确的使用形式是将数组作为它们的参数: int a[] = { 0,1,2,3,4,5,6,7,8,9 }; int *beg = begin(a);//指向a首元素的指针 int *last = end(a);//指向a尾元素的下一位置的指针 不能用动态数组 这两个函数定义在

标准库函数begin和end

//begin()和end()函数我没有调用成功,还不清楚原因,也没查 //代码运行提示表示,该区域没定义此函数,可能是作用域的问题? 1.相关知识点 1.begin()函数返回首元素的指针, end()函数返回数组尾元素下一位置的指针,两个函数定义域iterator头文件 2.相关联系代码 1 #include<iostream> 2 #include<iterator> //该头文件中有begin,end函数 3 using namespace std; 4 int main(

C语言中最常用标准库函数

标准头文件包括: <asset.h>      <ctype.h>       <errno.h>       <float.h> <limits.h>      <locale.h>       <math.h>        <setjmp.h> <signal.h>     <stdarg.h>      <stddef.h>      <stdlib.h>

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

概括地说 1.malloc与free是C++/C的标准库函数,new/delete是C++的运算符,它们都可用于申请动态内存和释放内存. 2.对于非内部数据类型的对象而言,只用malloc/free无法满足动态对象的要求.对象在创建的同时,要自动执行构造函数,对象在消亡之前要自动执行析构函数.而由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free. 3.因此C++语言需要一个能完成动态内存分配和初始化工作的运算符

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

目录导航 声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 20.17.       表字段初始值.NULL等问题... 249 20.17.1.            SE11表设置中的Initial Values. 249 20.17.2.            底层数据库表字段默认值... 249 20.17.3.            ABAP初始值.底层数据库表默认值相互转换... 250 20.17.3.1.     

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

malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存.下面来看他们的区别. 一.操作对象有所不同 malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求. 对象在创建的同时要自动执行构造函数,对象消亡之前要自动执行析构函数.由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能把执行构造函数

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

你好,C++(11)如何用string数据类型表示一串文字?根据初始值自动推断数据类型的auto关键字(C++ 11) 3.5.2  字符串类型 使用char类型的变量我们可以表示单个字符,那么,我们又该如何表示拥有多个字符的字符串呢? 我们注意到,一个字符串是由多个字符串连起来形成的.很自然地,一种最简单直接的方法就是利用数组(一种数据组织管理方式,它将多个相同类型的数据元素组织起来,形成一个数据序列以便于访问.更多可以参考后文3.6小节对数组的介绍)来保存一个字符串中的各个字符,最后用一个特

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

3.5.2  字符串类型 使用char类型的变量我们可以表示单个字符,那么,我们又该如何表示拥有多个字符的字符串呢? 我们注意到,一个字符串是由多个字符串连起来形成的.很自然地,一种最简单直接的方法就是利用数组(一种数据组织管理方式,它将多个相同类型的数据元素组织起来,形成一个数据序列以便于访问.更多可以参考后文3.6小节对数组的介绍)来保存一个字符串中的各个字符,最后用一个特殊字符'\0'表示字符串的结束,以此来将多个char类型的字符数据串联成字符串.例如: // 定义一个字符数组,用以保存

&lt;转&gt;类型初始值设定项引发异常

类型初始值设定项引发异常 连续两天都为这个运行时错误“类型初始值设定项引发异常”而烦恼,调试也不知道哪里出 了问题.上网Google一下,一大堆相同的问题,可是按照那些方法折腾来折腾去,问题还是一样.最后在CSDN上发帖子问了,果然“重赏之下必有勇 夫”,很快就有高手回复了,问题也随着解决了.哈哈.在此写个随笔,以后如果大家遇到类似问题,也可参考一下,自己也做个备忘,不然放在电脑上,又找不 到,我的电脑文件到处乱放,有时连我自己都找不到^_^. 问题是这样嘀: 项目采用了三层架构和工厂模式,并借