C++新特性initializer_list

本文探讨了C++中的std::initializer_list,如何用它来初始化数据、传递参数给函数和构造函数,以及在类中使用。通过示例展示了如何创建和操作这些轻量级的模板类型。
#include <iostream>
#include <vector>
/*
    std::initializer_list轻量级模板类型可以进行任意相同类型的长度的数据初始化
    size: 获取列表参数个数
    begin/end:容器元素迭代操作
*/
// 用于普通函数
void Func(std::initializer_list<int> ls)
{
    std::cout << "size:" << ls.size() << std::endl;
    auto it = ls.begin();
    for (; it != ls.end(); ++it)
    {
        std::cout << *it << std::endl;
    }
}

void Test1()
{
    // 初始化列表作为参数
    Func({1, 2, 3, 4});
}
// 返回初始化列表,用户构造临时对象
std::vector<int> Func() {
	return {1,2};
}
// 返回初始化列表,初始化常量引用
const std::vector<int>& Func() {
	return {1,2};
}
// 用于类构造函数
class Test
{
public:
    // 作用与构造函数参数
    Test(std::initializer_list<int> ls)
    {
        auto it = ls.begin();
        for (; it != ls.end(); ++it)
        {
            m_vec.push_back(*it);
        }
    }

    void Func()
    {
        for (auto it : m_vec)
        {
            std::cout << it << std::endl;
        }
    }

private:
    std::vector<int> m_vec;
};

void Test2()
{
    Test t{1, 2, 3, 4};
    t.Func();
}
int main()
{
    Test1();
    Test2();
    return 0;
}
`std::initializer_list` 是 C++11 引入的一个模板类,用于支持列表初始化。下面从基本概念、常用函数、使用方式和特点等方面详细介绍: ### 基本概念 `std::initializer_list` 是 C++ 提供的一种模板类型,可用于将 STL 容器初始化为一系列值。可以使用初始化列表语法 `{}` 来创建 `std::initializer_list` 对象,例如: ```cpp #include <iostream> #include <initializer_list> int main() { std::initializer_list<int> lst1 = { 1, 2, 3 }; return 0; } ``` ### 常用函数 `std::initializer_list` 类有三种常用的函数: - `size()`:获取 `std::initializer_list` 对象中的元素个数。 - `begin()`:获取 `std::initializer_list` 对象中第一个元素位置的迭代器。 - `end()`:获取 `std::initializer_list` 对象中最后一个元素下一个位置的迭代器 [^2]。 示例代码如下: ```cpp #include <iostream> #include <initializer_list> void print(std::initializer_list<int> list) { for (auto it = list.begin(); it != list.end(); ++it) std::cout << *it << " "; std::cout << std::endl; std::cout << "Size: " << list.size() << std::endl; } int main() { print({ 1,2,3,4,5,6,7 }); return 0; } ``` ### 使用方式 C++11 对 STL 中的不少容器增加了将 `std::initializer_list<T>` 作为参数的构造函数,这样初始化容器对象更方便,也可以作为 `operator=` 的参数,用大括号赋值。示例如下: ```cpp #include <iostream> #include <vector> #include <list> #include <map> #include <string> int main() { std::vector<int> v = { 1,2,3,4 }; std::list<int> lt = { 1,2 }; std::map<std::string, std::string> dict = { {"sort", "排序"}, {"insert", "插入"} }; v = { 10, 20, 30 }; return 0; } ``` ### 特点 - **共享内存**:用一个 `std::initializer_list` 对象初始化另一个对象时,它们共享同一块内存,不会进行复制。例如: ```cpp #include <iostream> #include <initializer_list> int main() { std::initializer_list<int> lst1 = { 1, 2, 3 }; std::initializer_list<int> lst2 = lst1; std::cout << &(*lst1.begin()) << std::endl << &(*lst2.begin()) << std::endl; return 0; } ``` - **不可修改**:构造 `std::initializer_list` 对象后,不能对其中的值进行修改,但可以让它指向另一块内存 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值