C++11特性(模板类 initializer_list)

C++primer 原文如下:

通读原文相关篇幅,分析解读内容如下:

提供initializer_list类的初衷,为了便于将有限个同一类型(或可转换为同一类型)的元素传递给函数。

代码:

/*  initializer_list 是C++11新增的,可以使用它来初始化STL:
           例如:std::vector<double> payments {45.9,39.3,19.59,89.1};
           上述声明与下述代码等价(这里显式的将列表指定为构造函数参数):
           std::vector<double> payments ({45.9,39.3,19.59,89.1});
        
在C++11 可以使用 {} 而不是 () 来 调用类的构造函数:
           shared_ptr<double> pd{new double};   //ok to use {} instead of () 
*/
 
/*   提供initializer_list 类的初衷,旨在能够将一系列的值换递给构造函数或其他函数。
     注意:initializer_list 的迭代器类型为const,因此不能修改initializer_list中的值。 
    即不能这么做:
            *dl.begin() = 20.0;    错误做法。 
    但可以将一个initializer_list 赋给另一个 initializer_list :
             dl={16.0,25.0,36.0,49.0,64.0}; 
  
*/   
#include<iostream>
#include<initializer_list>
 
double sum(std::initializer_list<double> il);
double average(const std::initializer_list<double> &ril);
 
int main(int argc,char **argv){
    using std::cout;
    using std::endl;
    
    cout<<"List 1:sum = "<<sum({2,3,4})<<", average= "<<average({2,3,4})<<endl;
    std::initializer_list<double> dl={1.1,2.2,3.3,4.4,5.5};
    cout<<"List 2:sum = "<<sum(dl)<<", average= "<<average(dl)<<endl;
    
    dl={16.0,25.0,36.0,49.0,64.0};
    cout<<"List 3:sum = "<<sum(dl)<<", average= "<<average(dl)<<endl;
    
    return 0;
}
double sum(std::initializer_list<double> il){
    double tot = 0;
    for(auto p = il.begin();p != il.end();++p){
        tot += *p;
    }
    return tot;
    
}
 
double average(const std::initializer_list<double> &ril){
    double tot = 0;
    int n = ril.size();
    double ave = 0.0;
    if(n > 0){
        for(auto p = ril.begin();p != ril.end();++p){
            tot+=*p;
        }
        ave = tot / n;
    }
    return ave;
 
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值