initializer_list简介以及使用initializer_list实现print

最近学习了C++2.0版本的一些新的特性,利用initializer_list实现print。该类模板中主要有三个方法:begin()、end()迭代器以及获取区间中元素个数的方法size()

语法

initializer_list 是一种C++11新的类型特性,它允许我们以统一的方式初始化对象。它是一个代表数组的轻量级包装器,通常用于构造函数和函数参数中,以允许传递一个初始化元素列表。

  • initializer_list也是一种模板类型。template< class T >class initializer_list;

  • 包含begin()、end()迭代器以及获取区间中元素个数的方法size()方法

语言环境

Dev-C++ 5.11
并需要自己的环境是支持C++11的,例如:Dev-C++ 5.11可以通过以下步骤进行修改:
在这里插入图片描述
在这里插入图片描述

实例源码

#include <iostream>

namespace my{
	void print(std::initializer_list<int> vals){
		for(auto p=vals.begin();p!=vals.end();++p){
			std::cout<<*p<<"  ";
		}
	}
}

int main() {
	my::print({12,3,5,7,11,12,18});

	system("pause");
	return 0;
}

原理

  1. 在调用自己实现的print时,编译器看到是以{}进行打包的,会自动转换为initializer_list类型;
  2. 利用其中提供的begin,end函数,可以依次打印出我们传入的值。

运行结果展示

在这里插入图片描述

注意:

  1. 不要起和标准库中的tuple冲突的名字,或者在自己的命名空间下;
  2. 要保证编译器支持C++11
  3. 一定要加{}
  4. 与Variadic Templates不同,initializer_list<>支持的参数类型必须是相同的。

同理简单使用

#include <initializer_list>
#include <iostream>
#include <vector>
 
template<class T>
struct S
{
    std::vector<T> v;
    S(std::initializer_list<T> l) : v(l){
        std::cout << "size is " << l.size() << "\n";
    }
 
    void append(std::initializer_list<T> l){
        v.insert(v.end(), l.begin(), l.end());
    }
 
    std::pair<const T*, std::size_t> c_arr() const{
        return {&v[0], v.size()}; 
    }
};
 
int main()
{
    S<int> s = {1, 2, 3, 4, 5}; 
    s.append({6, 7, 8});        
    
    std::cout << "The vector now has " << s.c_arr().second << " ints:\n";
 
    for (auto n : s.v)
        std::cout << n << ' ';
    std::cout << '\n';
       
}

在这里插入图片描述

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值