• 介绍一个好东西C++11


    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等容器。

  • 相关阅读:
    UESTC 250 windy数 数位dp
    hdu 3555 bomb 数位dp
    hdu 2089 不要62 数位dp入门
    poj 3740 Easy Finding 精确匹配
    codeforces 589F. Gourmet and Banquet 二分+网络流
    hdu 3572 Escape 网络流
    hdu 3572 Task Schedule 网络流
    POJ 1823 Hotel 线段树
    2016年,机器学习和人工智能领域有什么重大进展?
    【由浅入深的VR技术之旅】初学VR要解决的三个核心技术问题
  • 原文地址:https://www.cnblogs.com/CSE-kun/p/14495762.html
Copyright © 2020-2023  润新知