C++11 列表初始化(initializer_list),pair

简介: C++11 列表初始化(initializer_list),pair

1. {} 初始化

C++98 中,允许使用 {} 对数组进行初始化。

int arr[3] = { 0, 1, 2 };

C++11 扩大了 {} 初始化 的使用范围,使其可用于所有内置类型和自定义类型。

struct Date
{
    int _year;
    int _month;
    int _day;
    Date(int year, int month, int day)
        :_year(year)
        ,_month(month)
        ,_day(day)
    {}
};

int main()
{
    // 两种常见的用法:
    Date d1{2024, 6, 8};
    Date d2 = {2024, 6, 8};

    // 列表初始化可用于 new 表达式
    int* pa = new int[4]{ 0 };

    return 0;
}

2. std::initializer_list

int main()
{
    auto arr = { 1, 2, 3 };
    cout << typeid(arr).name() << endl; // typeid().name() 用于查看对象的数据类型

    return 0;
}

std::initializer_list 是 C++11 引入的一个模板类型,用于处理一组同类型初始值

主要用于构造函数和函数参数列表中,允许使用 {} 初始化或传递一系列相同类型的值。

std::initializer_list 作为构造函数的参数,C++11 对不少容器增加了 initializer_list 作为参数的构造函数:

std::initializer_list 作为 operator=() 的函数参数:

常见的使用场景:

int main()
{
    map<string, string> dict{ {"iterator", "迭代器"}, {"singularity", "奇异"}, {"sort", "排序"} };
    vector<int> v = { 1, 2, 3, 4, 5 };

    return 0;
}

3. pair 的补充知识

namespace MyTest 
{
  template<class T1, class T2>
    struct pair
    {
        pair(const T1& first, const T2& second)
            :_first(first)
            ,_second(second)
        {}

        template<class K, class V>
        pair(const pair<K, V>& kv)
            :_first(kv._first)
            ,_second(kv._second)
        {}

    
        T1 _first;
        T2 _second;
    };
}
相关文章
|
5天前
|
JavaScript
DOM 节点列表长度(Node List Length)
`length`属性用于获取DOM节点列表的长度,即节点数量。通过遍历这个属性,可以访问和处理所有节点。例如,示例代码加载&quot;books.xml&quot;,获取所有&quot;title&quot;节点,并依次输出它们的第一个子节点的值。
|
9天前
|
JavaScript
DOM 节点列表长度(Node List Length)
`length`属性用于获取DOM节点列表的元素数量。在示例中,代码加载&quot;books.xml&quot;,然后通过`getElementsByTagName(&quot;title&quot;)`获取所有标题节点。使用`for`循环遍历这些节点,输出每个标题的文本内容。
|
4天前
|
存储 Java C++
【c++】list详细讲解
【c++】list详细讲解
14 5
|
3天前
|
存储 缓存 Python
Python中的列表(List)和元组(Tuple)是两种重要的数据结构
【7月更文挑战第12天】Python中的列表(List)和元组(Tuple)是两种重要的数据结构
6 1
|
4天前
|
Java C++ Python
【c++】list 模拟
【c++】list 模拟
7 1
|
12天前
|
存储 编译器 C语言
【C++】list模拟实现
本文档介绍了C++ STL中`list`容器的模拟实现,包括`ListNode`节点类、迭代器类和`list`类的详细设计。`ListNode`模板类存储数据并维护前后指针;`ListIterator`是一个复杂的模板类,提供解引用、自增/自减以及比较操作。`list`类包含了链表的各种操作,如插入、删除、访问元素等,并使用迭代器作为访问接口。实现中,迭代器不再是简单的指针,而是拥有完整功能的对象。此外,文档还提到了迭代器的实现对C++语法的特殊处理,使得`it-&gt;_val`的写法成为可能。文章通过分步骤展示`list`的各个组件的实现,帮助读者深入理解STL容器的内部工作原理。
|
12天前
|
算法 搜索推荐 C++
【C++】list的使用(下)
`C++` 中 `std::list` 的 `merge()`、`sort()` 和 `reverse()` 操作: - `merge(x)` 和 `merge(x, comp)`: 合并两个已排序的`list`,将`x`的元素按顺序插入当前`list`,`x`清空。比较可自定义。 - `sort()` 和 `sort(comp)`: 对`list`元素排序,保持等价元素相对顺序。内置排序基于稳定排序算法,速度较慢。 -reverse(): 反转`list`中元素的顺序。 这些操作不涉及元素构造/销毁,直接移动元素。注意,`sort()`不适合`std::list`,因链表结构不利于快速排序
|
12天前
|
C++ 容器
【C++】list的使用(下)
这篇博客探讨了C++ STL中`list`容器的几个关键操作,包括`splice()`、`remove()`、`remove_if()`和`unique()`。`splice()`允许高效地合并或移动`list`中的元素,无需构造或销毁。`remove()`根据值删除元素,而`remove_if()`则基于谓词移除元素。`unique()`则去除连续重复的元素,可选地使用自定义比较函数。每个操作都附带了代码示例以说明其用法。
|
12天前
|
编译器 C++ 容器
【C++】list的使用(上)
迭代器在STL中统一了访问接口,如`list`的`begin()`和`end()`。示例展示了如何使用正向和反向迭代器遍历`list`。注意`list`的迭代器不支持加减操作,只能用`++`和`--`。容器的`empty()`和`size()`用于检查状态和获取元素数。`front()`和`back()`访问首尾元素,`assign()`重载函数用于替换内容,`push_*/pop_*`管理两端元素,`insert()`插入元素,`erase()`删除元素,`resize()`调整大小,`clear()`清空容器。这些接口与`vector`和`string`类似,方便使用。
|
7天前
|
JavaScript
DOM 节点列表长度(Node List Length)
`length`属性用于获取DOM节点列表的元素数量。通过遍历这个属性,如`for (i=0; i&lt;x.length; i++)`,可以访问和处理每个节点。在示例中,加载&quot;books.xml&quot;,然后获取所有&quot;&lt;title&gt;&quot;标签,并输出它们的子节点值。