c++ initializer_list

首先需要开启编译器C++11,按照如下步骤(codeblocks)

Setting-->Compiler 勾选下图红色方框的选项。

首先看看initializer_list 的作用,可以用大括号来初始化STL的容器,以及可以在for循环中来使用。

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4
 5 int main()
 6 {
 7     vector<string> v{"ab","cd"};
 8     vector<string>::iterator begin = v.begin();
 9     while(begin!=v.end())
10     {
11         cout << *begin++ << endl;
12     }
13     for(int i:{1,2,3})
14     {
15         cout << i << endl;
16     }
17     return 0;
18 }

打印结果如下:

来看看正式的作用:

我们可以在一个函数的参数中声明initializer_list,这样,我们在调用这个函数时,可以直接给这个函数传递大括号即可。如下代码所示:

 1 #ifndef S_H_INCLUDED
 2 #define S_H_INCLUDED
 3
 4 #include <vector>
 5 #include <initializer_list>
 6 #include <iostream>
 7
 8 using namespace std;
 9
10 template <typename T>
11 class S
12 {
13 private:
14     vector<T> v;
15 public:
16     S(initializer_list<T> l):v(l)
17     {
18         cout << "constructed with a " << l.size() << " -element lists" << endl;
19     }
20     void append(initializer_list<T> l)
21     {
22         v.insert(v.end(),l.begin(),l.end());
23     }
24     void append(T t)
25     {
26         v.push_back(t);
27     }
28     void print()
29     {
30         typename vector<T>::iterator begin = v.begin();
31         while(begin!=v.end())
32         {
33             cout << *begin++ << endl;
34         }
35     }
36 };
37
38 #endif // S_H_INCLUDED

看看调用的代码:

 1 #include <iostream>
 2 #include "S.h"
 3
 4 using namespace std;
 5
 6 int main()
 7 {
 8     S<int> s{10};
 9     s.append(1);
10     s.append({2,3,4,6,9});
11     cout << "begin to print()" << endl;
12     s.print();
13     return 0;
14 }

最后打印结果如下:

不要忘记了,头文件是 #include <initializer_list>

时间: 2024-08-23 20:22:29

c++ initializer_list的相关文章

C++11中uniform initialization和initializer_list

C++11中出现了uniform initialization的概念: int a1 = {1};//ok int a2 = {1.0};//错误,必须收缩转换 int array1[] = {1,2,3,4};//ok int arrya2[] = {1.0,2.0,3.0,4.0};//ok 注意a2的初始化错误和array2的正确对比.一方面uniform initialization要求初始化的类型必须是一致的,但一方面新的C++标准必须兼容C++98,而在C++98中array2的初始

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新特性——初始化列表 initializer_list

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

C++11中新特性之:initializer_list详解

C++11提供的新类型,定义在<initializer_list>头文件中. template< class T > class initializer_list; 先说它的用处吧,然后再详细介绍一下. 首先有了initializer_list之后,对于STL的container的初始化就方便多了,比如以前初始化一个vector需要这样: int a[] = {0, 1, 2, 3}; std::vector<int> vec(a, a+sizeof(a)); 或者 s

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 // dy

initializer_list

initializer_list是一种模板类型,定义initializer_list对象是,必须说明列表中所含元素的类型: initializer_list<Type> lst{a, b, c...}; 后面的大括号可以省略,不赋初始值. 和vector一样,可以用于函数形参中,和vector不同的是,initializer_list对象中的元素永远是常量值,我们无法改变initializer_list对象中的值. 原文地址:https://www.cnblogs.com/ScaleCX/p/

初始化列表initializer_list

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

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

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

C++ 11 vlearning

1.新增算术类型     longlong,最小不比long小,一般为64位. 2.列表初始化      int units_sold = {0};或者 int units_sold{0};非11标准下的C++中,只有特定的情况下才能使用该形式.  比如数组的初始化,类构造函数的初始化,结构体的填充.相比传统的赋值初始化,如果右侧的数值类型相对于左侧类型更大的话,侧对于这种窄化现象,编译器会 报错.如:int k = {3.14};一个double是8个字节,int一般是4个字节,这时编译器就会