C++11新特性之initializer_list

C++11提供的新类型,定义在<initializer_list>头文件中:
template< class T >
class initializer_list;

用处:initializer_list使STL的container初始化更加方便,可以实现像初始化数组一样对container进行初始化。
例如:
在有initializer_list之前初始化一个vector的过程:

int a[] = {0, 1, 2, 3};
std::vector<int> vec(a, a+sizeof(a));

或者:

std::vector<int> vec;
vec.push_back(1);
vec.push_back(3);
vec.push_back(3);
vec.push_back(2);

有initializer_list之后初始化一个map的过程:

class Test {
private:
    static std::map<string, string> const nameToBirthday = {
        {"lisi", "18841011"},
        {"zhangsan", "18850123"},
        {"wangwu", "18870908"},
        {"zhaoliu", "18810316"},
    };
}

其中,std::map必须提供参数为initializer_list的构造函数,如:

map( std::initializer_list<value_type> init,
     const Compare& comp = Compare(),
     const Allocator& alloc = Allocator() );

如果for(initializer:list)中如果list是个形如:{a, b, c…},那么list将自动被构造成了initializer_list对象。

介绍:一个initializer_list当出现在以下两种情况的被自动构造:
1、当初始化的时候使用的是大括号初始化,被自动构造,包括函数调用时和赋值;
2、当涉及到for(initializer:list)时,list被自动构造成initializer_list对象。
也就是说initializer_list对象只能用大括号{}初始化。
另外,拷贝一个initializer_list对象并不会拷贝里面的元素,其实只是引用而已,而且里面的元素全部都是const的。

例子:

#include <iostream>
#include <vector>
#include <initializer_list>
using namespace std;
template <class T>
struct  S
 {
    vector<T> v;
    S(initializer_list<T> l) : v(l){
        cout << "constructed with a " << l.size() << "-elements lists" << endl;
    }
    void append(std::initializer_list<T> l) {
        v.insert(v.end(), l.begin(), l.end());
    }

    pair<const T*, size_t> c_arr() const{
        return {&v[0], v.size()};
    }
};
template <typename T>
void templated_fn(T arg) 
{
for (auto a : arg)
{
        cout << a << " ";
}
Else
{
cout << endl;
}
}
int main()
 {
    S<int> s = {1, 2, 3, 4, 5}; 		//	自动构造一个initializer_list 
    s.append({6, 7 , 8});         //函数调用中的列表初始化
    cout << "The vector size is now " << s.c_arr().second << " ints:" << endl;
    for (auto n : s.v)
        cout << ' ' << n;
    cout << endl;
    cout << "range-for over brace-init-list: " << endl;
    for (auto x : {-1, -2, 03})   
        cout << x << " ";
    cout << endl;
    auto al = {10, 11, 12};  
    cout << "The list bound to auto has size() = " << al.size() << endl;.
    templated_fn<initializer_list<int> > ({7, 8, 9}); 
    templated_fn<vector<int> >({3, 5, 7});        
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值