zoukankan      html  css  js  c++  java
  • 介绍一个好东西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等容器。

  • 相关阅读:
    Java类加载器回顾
    2018第24周总结
    JUC类图
    CopyOnWrite 策略
    Python导入模块的几种姿势
    查看linux接口进出口流量的命令;linux 网络监控;流量监控
    jenkins修改日志级别方法
    top命令查看线程信息和jstack使用介绍
    How to force immediate stop of threads in Jmeter servers如何在jmeter执行完,立即停止jmeter
    pycharm支持react
  • 原文地址:https://www.cnblogs.com/CSE-kun/p/14495762.html
Copyright © 2011-2022 走看看