码迷,mamicode.com
首页 > 编程语言 > 详细

介绍一个好东西C++11

时间:2021-03-08 14:14:54      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:编程   区间   成员   语法   成员函数   for   类型   泛型   析构   

c++11引入了auto类型说明符,auto让编译器通过初始值来推算变量的类型,所以auto定义的变量必须有初始值。

ranged-base for 范围for
C++11 引入了一种崭新的for循环形式,可以逐一迭代某个给定的区间、数组、集合内的每个元素。其他编程语言可能称此为foreach循环。
其一般性语法如下:

for ( decl : coll)
{
    statement
}

实例:

for ( int i :{ 2,3,5,7,9,13,17,19})
{
     cout<<i<<endl;
}

vector<double> vec;
...
for(auto elem : vec)    //编译器会一个一个的取vec中的元素取出来copy到elem中去,然后输出。
{
    cout<<elem<<endl;
}    


for(auto& elem : vec)    //pass by reference
{                        //这里声明elem为一个引用很重要,若不这么做,for循环中 的语句会作用在元素的一份本地拷贝身上。
    elem*=3;
}

这里声明elem为一个引用很重要,若不这么做,for循环中 的语句会作用在元素的一份本地拷贝身上。

这意味着,为了避免调用每个元素的copy构造函数和析构函数,你通常应该声明当前元素为一个const引用。于是一个用来“打印某集合内所有元素”的泛型函数应该写成这样:

template <typename T>
void printElements (const T& coll)
{
	for(const auto& elem : coll) {
		std::cout << elem << std::endl;
	}
}

// 这个所谓的range-based for语句等同于:
{
	for(auto _pos = coll.begin(); _pos != coll.end(); ++_pos) {
		const auto& elem = *_pos;
		std::cout << elem << std::endl;
	}
}

// 一般而言,如果coll提供成员函数begin()和end(),那么一个range-based for循环声明为
for(decl : coll) {
	statement
}
// 便等同于
{
	for(auto _pos = coll.begin(), _end = coll.end; _pos != coll.end(); ++_pos) {
		decl = *_pos;
		statement
	}
}



范围for循环有两种用法:可以遍历字符串,数组,map,vector等容器。

介绍一个好东西C++11

标签:编程   区间   成员   语法   成员函数   for   类型   泛型   析构   

原文地址:https://www.cnblogs.com/CSE-kun/p/14495762.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!