• C++ 初始化列表


    20 C++ 初始化列表

    20.1 初始化列表简介

    使用举例: 以下两句是同样的含义:

    std::vector payments({45.99, 39.23, 19.95, 89.01});
    std::vector payments {45.99, 39.23, 19.95, 89.01};

    --此语句将创建一个容器包含四个元素并用右侧的四个元素初始化容器。 为什么能使用初始化列表:定义了一个可以将初始化列表作为参数的构造函数。 一个小疑问:

    std::vector vi{10}; // ??这一句执行的是以下的哪一个
    std::vector vi(10); // case A: 10 uninitialized elements
    std::vector vi({10}); // case B: 1 element set to 10

    是caseB

    20.2 初始化列表的强制类型转换

    std::vector payments {45.99, 39.23, 19, 89};
    // same as std::vector payments {45.99, 39.23, 19.0, 89.0};

    但是不允许缩窄变换:

    std::vector values = {10, 8, 5.5}; // narrowing, compile-time error

    初始化列表的意义:除非要处理长度不同的列表,否则让容器接受初始化列表作为参数没有意义。

    20.3 初始化列表类

    initializer_list objects定义头文件:initializer_list,可以包含该头文件直接使用初始化列表类 initializer_list类只有两个迭代器,一个指向列表开头,另一个指向列表结尾后一个位置,他们都是const类型

    *dl.begin() = 2011.6; // not allowed

    注意事项:不能修改初始化列表对象的元素,但是可以将一个初始化列表复制给另一个初始化列表。

    20.4 举例

    代码

    /*
    Project name :          _31initializer_list
    Last modified Date:     2022年4月20日11点05分
    Last Version:           V1.0
    Descriptions:           初始化列表
    */
    /*
    初始化列表:
        使用举例:
            以下两句是同样的含义:
            std::vector payments({45.99, 39.23, 19.95, 89.01});
            std::vector payments {45.99, 39.23, 19.95, 89.01};
            --此语句将创建一个容器包含四个元素并用右侧的四个元素初始化容器。
        为什么能使用初始化列表:
            定义了一个可以将初始化列表作为参数的构造函数。
        一个小疑问:
            std::vector vi{10}; // ??这一句执行的是以下的哪一个
            std::vector vi(10); // case A: 10 uninitialized elements
            std::vector vi({10}); // case B: 1 element set to 10
            是caseB
        初始化列表的强制类型转换:
            std::vector payments {45.99, 39.23, 19, 89};
            // same as std::vector payments {45.99, 39.23, 19.0, 89.0};
            但是不允许缩窄变换:
            std::vector values = {10, 8, 5.5}; // narrowing, compile-time error
        初始化列表的意义:除非要处理长度不同的列表,否则让容器接受初始化列表作为参数没有意义。
    初始化列表类:
        initializer_list objects定义头文件:initializer_list,可以包含该头文件直接使用初始化列表类
        initializer_list类只有两个迭代器,一个指向列表开头,另一个指向列表结尾后一个位置,他们都是const类型
            *dl.begin() = 2011.6; // not allowed
        注意事项:不能修改初始化列表对象的元素,但是可以将一个初始化列表复制给另一个初始化列表。
    */
    #include 
    #include 
    double sum(std::initializer_list il);
    double average(const std::initializer_list& ril);
    int main()
    {
        using std::cout;
        cout << "List 1: sum = " << sum({ 2,3,4 })
            << ", ave = " << average({ 2,3,4 }) << '\n';
        std::initializer_list dl = { 1.1, 2.2, 3.3, 4.4, 5.5 };
        std::initializer_list d2 = dl;
        cout << "List 2: sum = " << sum(dl)
            << ", ave = " << average(dl) << '\n';
        cout << "List 2: sum = " << sum(d2)
            << ", ave = " << average(d2) << '\n';
        dl = { 16.0, 25.0, 36.0, 40.0, 64.0 };
        cout << "List 3: sum = " << sum(dl)
            << ", ave = " << average(dl) << '\n';
        return 0;
    }
    double sum(std::initializer_list il)
    {
        double tot = 0;
        for (auto p = il.begin(); p != il.end(); p++)
            tot += *p;
        return tot;
    }
    double average(const std::initializer_list& 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;
    }

    运行结果

    List 1: sum = 9, ave = 3
    List 2: sum = 16.5, ave = 3.3
    List 2: sum = 16.5, ave = 3.3
    List 3: sum = 181, ave = 36.2
    ​
    D:\Prj\_C++Self\_31initializer_list\x64\Debug\_31initializer_list.exe (进程 16096)已退出,代码为 0。
    要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
    按任意键关闭此窗口. . .
  • 相关阅读:
    永久关闭win10系统自动更新以及如何部署虚拟机以win xp为例
    JAX介绍
    【Java SE】汉诺塔问题
    Linux环境安装开发grafana插件(一)试水
    华为HCIE云计算之ebackup备份FC虚拟机
    【stm32】大一上学期笔记复制
    mysql InnoDB事务
    全面解析内存泄漏检测与修复技术
    第28节-PhotoShop基础课程-蒙版
    Halcon 3D相关案例分享
  • 原文地址:https://blog.csdn.net/weixin_44410704/article/details/127995628