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

C++11对原有的初始化列表(用花括号围住的若干个值)进行了大幅的扩展。以下写法在C++11中都是被允许的:

 1 int static_arr[5] = {1, 2, 3, 4};  // static_arr[4] is not initialized here
 2 int static_arr2[] {1, 2, 3, 4};    // operator = can be omitted
 3
 4 int* dynamic_arr = new int[5] {1, 2, 3, 4};
 5 // dynamic_arr[4] is not initialized here
 6
 7 vector<int> stl_vec {1, 2, 3, 4};
 8 set<int> stl_set {1, 2, 3, 3};
 9 cout << stl_set.size() << endl;    // 3
10
11 map<const char*, int> stl_map {
12     {"Alice", 1},
13     {"Bob", 2},
14     {"Cindy", 3}
15 };

C++11将初始化列表解释成一个initializer_list<T>类型的变量(T是列表中元素的类型)。它相当于一个只读的容器,只有三个成员函数:size(),begin()和end()。

在上面这个例子中,我们用初始化列表为STL容器提供初值。C++11为STL容器新增了一种构造函数,它可以接收一个initializer_list。

initializer_list也可以像其他类型的变量一样,在语句中被创建,或者用作函数(包括类的构造函数)的参数:

 1 #include <initializer_list> // This header is required
 2 #include <iostream>
 3
 4 using namespace std;
 5
 6 template <class Tp>
 7 void print_ilist(const initializer_list<Tp> &ilist)
 8 {
 9     for (auto it = ilist.begin(); it != ilist.end(); ++it)
10         cout << *it << endl;
11 }
12
13 struct Foo
14 {
15     int vals[10];
16     int n = 0;
17
18     Foo (const initializer_list<int> &ilist) {
19         for (int v: ilist)
20             vals[n++] = v;
21     }
22 };
23
24 int main()
25 {
26     initializer_list<int> empty_ilist;
27     empty_ilist = {1, 2, 3, 4};
28     cout << empty_ilist.size() << endl;  // 4
29
30     Foo foo {1, 2, 3};
31     Foo bar (empty_ilist);
32     cout << "bar.n = " << bar.n << endl; // 4
33
34     initializer_list<float> float_ilist {1.0, 1.2, 1.5, 2.0};
35     print_ilist(float_ilist);
36     print_ilist( {"Reimu", "Marisa", "Sanae", "Reisen"} );
37     return 0;
38 }
时间: 2024-11-06 13:54:24

C++11 初始化列表(initializer_list)的相关文章

C++11新特性——初始化列表 initializer_list

破事水: 由于最近数据结构有个实验报告说是要对字符串进行排序,想偷个懒不想一个一个地赋值,虽然可以用strcpy和传入二级指针的形式直接写,但是这样感觉不美观漂亮. 然后就去膜了一下C++11的新特性——初始化列表,概念就不说了,就讲下这东西具体怎么用吧,就是正常的写一个构造函数,然后把参数改为initializer_list<数据类型> &t 如图所示. 可以理解为传入的参数数据被放到了一个储存器t中,利用C++11的auto可以直接遍历这个储存器t,然后把遍历到的值给结构体用.这里

初始化列表initializer_list

初始化列表定义在<initializer_list>,初始化列表简化了参数数量可变的函数的编写,初始化列表的所有的元素都应该是同一种数据类型 由于定义了列表中允许的类型,所以初始化列表是安全的: #include <iostream> #include <initializer_list> /* run this program using the console pauser or add your own getch, system("pause"

c++11之初始化列表

一.前言 C++的学习中,我想每个人都被变量定义和申明折磨过,比如我在大学笔试过的几家公司,都考察了const和变量,类型的不同排列组合,让你区别有啥不同.反正在学习C++过程中已经被折磨惯了,今天再来看看重温下那段"辉煌的历史".先来看一段代码: Player pa; // (a) Player pb(); // (b) Player pc = Player(); // (c) Player pd(Player()); // (d) pd = Player() // (e) a,b,

[C++11笔记001]修改通用库中的XDynamicArray,使它可以支持C++11的初始化列表和for循环

今天,有空翻了一下<C++Primer plus(第六版)>,看到里面有介绍新的for循环和初始化列表,但是我实现的动态数组XDynamicArray不支持这些新特性,没办法,只好进行改造了. 首先是for循环,如下面的样式 for(auto e:stList) { cout<<e<<endl; } 是于就各种google,和查找C++11的array的源代码,总结:就是提供一个标准的iterator和begin,end这两个方法,就可以了. 是于定义了一个iterat

C++学习笔记18,C++11中的初始化列表构造函数(二)

C++11中的初始化列表构造函数(Initialize_list Constructors)是将std::initializer_list<T>作为第一个参数的构造函数,并且没有任何其他参数(或者其他参数具有默认值).例如: #include <iostream> #include <initializer_list>//必须包含该头文件 #include <vector> using namespace std; class A { private: ve

C++11之列表初始化

1. 在C++98中,标准允许使用花括号{}来对数组元素进行统一的集合(列表)初始化操作,如:int buf[] = {0};int arr[] = {1,2,3,4,5,6,7,8}; 可是对于自定义的类型,却是无法这样去初始化的,比如STL标准模板库中容器,使用的频率非常之高,如vector,若要初始化其内容,则需要每次进行push_back 或使用迭代器去初始化,这是极其不便的.C++11 中,可以”列表初始化“方式来快速的初始化内置类型或STL中容器. 2.集合(列表)的初始化方式已经成

列表初始化 分析initializer_list&lt;T&gt;的实现

列表初始化(1)_统一初始化 1. 统一初始化(Uniform Initialization) (1)在C++11之前,很多程序员特别是初学者对如何初始化一个变量或对象的问题很容易出现困惑.因为可以用小括号.大括号或赋值操作符等多种方式进行初始化. (2)基于这个原因,C++11引入了“统一初始化”的概念.这意味着我们可以使用{}这种通用的语法在任何需要初始化的地方. [实例分析]初始化列表 #include <iostream> #include <vector> #includ

c++11特性之initializer_list

之前写了一个博客< 浅析C++中的初始化列表(区别赋值和初始化)>,讲述了类的构造函数使用初始化列表来初始化成员变量. 现在,撇开过往不谈,就谈一谈普通的变量赋值.即是我们要提到的initializer_list. 这同样是一个C++11的特性. 过往,我们这样给vector赋值: std::vector v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); 需要感谢的是,C++11让你更方便. std::vect

C++11 初始化

C++11 初始化 统一初始化语法        C++11新添加初始化列表 std::initializer_list<>类型,可以通过{}语法来构造初始化列表 .初始化列表是常数:一旦被创建,其成员均不能被改变,成员中的数据也不能够被变动.函数能够使用初始化列表作为参数.         在引入C++ 11之前,有各种不同的初始化语法.在C++ 11中,仍可以使用这些初始化语法,但也可以选择使用新引入的统一的初始化语法.统一的初始化语法用一对大括号{}表示.         std::ve