initializer_list

一:作用

std::initializer_list 是 C++11 引入的一个新特性,它允许你在函数参数中传递一个花括号 {} 初始化的列表。这个列表是临时的,并且主要用于初始化数组、容器或其他需要多个初始值的对象,函数实参数量未知且全部实参类型都是相同的。

例子:

#include <iostream>  
#include <initializer_list>  
  
// 函数接受一个 int 类型的 initializer_list  
void print_numbers(std::initializer_list<int> nums) 
{  
    for (int num : nums) {  
        std::cout << num << ' ';  
    }  
    std::cout << '\n';  
}  
  
int main() 
{  
    // 使用花括号 {} 初始化一个 int 类型的 initializer_list  
    // 这个列表包含任意数量的 int 元素  
    print_numbers({1, 2, 3, 4, 5}); // 可以传递5个int  
    print_numbers({6, 7, 8});       // 可以传递3个int  
    print_numbers({});              // 甚至可以传递一个空的列表  
    return 0;  
}

注意:initializer_list对象元素永远是只读的(不可修改),不能保存引用或指针,其生命周期与它的作用域相同。

三、初始化方式

  • 默认初始化
std::initializer_list<T> lst;
  • 列表初始化
std::initializer_list<T> lst{1,2,3,4,5};
  • 拷贝初始化
std::initializer_list<int> lst1{1,2,3,4,5};
std::initializer_list<int> lst2(lst1);
  • 赋值初始化
std::initializer_list<int> lst3;
lst3 = lst1;

四、其他操作

initializer_list也是模板类型,用法于vector相似

  • 列表中的元素数量
lst.size();
  • 首元素指针和尾元素的下一个位置
lst.begin();
lst.end();

五、优点和缺点

优点

  1. 灵活性和扩展性:
    std::initializer_list 可以用于任何需要可变数量参数的函数中,提供了高度的灵活性和扩展性。你可以编写一个接受 std::initializer_list 参数的函数,使其能够接受任意数量的元素进行初始化。
  2. 兼容性:
    std::initializer_list 可以与现有的容器(如 std::vector、std::array、std::list 等)一起使用,使它们能够更容易地接受初始化列表。

缺点:

  1. 不支持动态大小调整:
    一旦使用 std::initializer_list 初始化一个对象,其大小将被确定,并且不能再进行动态大小调整。这意味着你不能像使用其他容器(如 std::vector)那样在运行时添加或删除元素。

  2. 只读性:
    std::initializer_list 是一个只读的容器,不支持添加、删除或修改元素。你只能遍历它并访问其元素。

  3. 临时性:
    std::initializer_list 对象通常是临时的,并且只在创建它们的代码块中存在。这可能会限制其使用范围,特别是在需要长时间保留或跨多个函数传递初始化列表的情况下。

posted @ 2024-05-16 22:45  baobaobashi  阅读(37)  评论(0编辑  收藏  举报