C++ initializer_list 列表初始化(八股总结)

定义

std::initializer_list 是 C++11 引入的一个类模板,用于支持列表初始化。它允许开发者使用花括号 {} 提供一组值直接初始化容器或自定义类型。std::initializer_list 提供了一种简洁优雅的语法来传递多个值。

主要用途
  1. 初始化容器

    使用列表初始化方式为容器赋值。

    cpp 复制代码
    #include <iostream>
    #include <vector>
    
    int main() {
        std::vector<int> vec = {1, 2, 3, 4, 5};
        for (int i : vec) {
            std::cout << i << " ";
        }
        return 0;
    }

    输出

    复制代码
    1 2 3 4 5
  2. 构造函数重载

    用于支持构造函数接受多参数的初始化列表。

    cpp 复制代码
    #include <iostream>
    #include <initializer_list>
    
    class MyClass {
    public:
        MyClass(std::initializer_list<int> values) {
            for (int value : values) {
                std::cout << value << " ";
            }
            std::cout << std::endl;
        }
    };
    
    int main() {
        MyClass obj = {10, 20, 30, 40};
        return 0;
    }

    输出

    复制代码
    10 20 30 40
  3. 函数参数

    用于函数接收可变数量参数的情景,提供了一种更直观的方式。

    cpp 复制代码
    #include <iostream>
    #include <initializer_list>
    
    void printValues(std::initializer_list<int> values) {
        for (int value : values) {
            std::cout << value << " ";
        }
        std::cout << std::endl;
    }
    
    int main() {
        printValues({5, 10, 15, 20});
        return 0;
    }

    输出

    复制代码
    5 10 15 20
区别分析

std::initializer_list 和传统的数组或 std::vector 的主要区别:

  1. 只读性std::initializer_list 的元素是只读的,无法修改。
  2. 临时性std::initializer_list 是轻量的,通常作为一个临时对象存在,生命周期受限。
  3. 用途 :主要用于初始化操作,而 std::vector 更适合复杂的动态数组操作。
示例代码对比

数组与初始化列表对比

cpp 复制代码
#include <iostream>
#include <vector>
#include <initializer_list>

void modifyArray(std::vector<int>& arr) {
    arr[0] = 99; // 可修改
}

void modifyInitList(std::initializer_list<int> values) {
    // values[0] = 99; // 错误,std::initializer_list 是只读的
    for (int value : values) {
        std::cout << value << " ";
    }
    std::cout << std::endl;
}

int main() {
    std::vector<int> arr = {1, 2, 3};
    modifyArray(arr);
    for (int val : arr) {
        std::cout << val << " "; // 输出 99 2 3
    }
    std::cout << std::endl;

    modifyInitList({4, 5, 6}); // 输出 4 5 6
    return 0;
}

通过以上分析可以看到,std::initializer_list 提供了一种便捷但只读的方式来初始化或传递一组值,非常适合初始化容器和自定义类型。

相关推荐
Zhichao_9731 分钟前
【UE5 C++课程系列笔记】33——商业化Json读写
c++·ue5
云边有个稻草人1 小时前
【C++】第八节—string类(上)——详解+代码示例
开发语言·c++·迭代器·string类·语法糖auto和范围for·string类的常用接口·operator[]
惊鸿一博1 小时前
c++ &&(通用引用)和&(左值引用)区别
开发语言·c++
nuo5342022 小时前
黑马 C++ 学习笔记
c语言·c++·笔记·学习
向宇it2 小时前
【零基础入门unity游戏开发——2D篇】2D 游戏场景地形编辑器——TileMap的使用介绍
开发语言·游戏·unity·c#·编辑器·游戏引擎
DARLING Zero two♡2 小时前
C++类间的 “接力棒“ 传递:继承(上)
开发语言·c++·继承·里氏替换原则
会讲英语的码农2 小时前
如何学习C++以及C++的宏观认知
开发语言·c++·学习
Merokes10 小时前
关于Gstreamer+MPP硬件加速推流问题:视频输入video0被占用
c++·音视频·rk3588
请来次降维打击!!!11 小时前
优选算法系列(5.位运算)
java·前端·c++·算法
别NULL11 小时前
机试题——统计最少媒体包发送源个数
c++·算法·媒体