C++11之初始化列表

2023-11-17

系列文章

C++11之正则表达式(regex_match、regex_search、regex_replace)

C++11之线程库(Thread、Mutex、atomic、lock_guard、同步)

C++11之智能指针(unique_ptr、shared_ptr、weak_ptr、auto_ptr)浅谈内存管理

C++11之强制类型转换(static_cast,const_cast,dynamic_cast,reinterpret_cast)

C++11之Lanbda表达式(匿名函数)

C++11之右值引用:移动语义和完美转发(带你了解移动构造函数、纯右值、将亡值、右值引用、std::move、forward等新概念)

C++11之继承构造函数(using 声明)

C++11之委派构造函数

C++11之显式转换操作符-explicit



初始化列表

C++98之初始化列表

其实在初始化列表这个词并不陌生,早在C++98中就已经引入了。可以通过{}一对大括号对数组元素进行统一的初始值设定。
如:int a{2}; int arr[] = {1,5,2};
但是这种方式初始化仅仅支持内置类型,也就是说结构体类型,容器都是不支持的。

例如下面这段代码,可以看到只有数组a能被正常初始化。
在这里插入图片描述

C++11之初始化列表

在C++11标准中,又对初始化列表的功能进行一次强化

初始化列表前有无=等号作用相同,例如下面几种写法都是正确的。
1 int a = {5 + 5};
2 int a{2+1};
3 int a{3+1};
4 int* p = new int(1);
5 int* p = new int{9};

initializer_list模板类

用于对象的初始化

initializer_list是C++11提供的新类型,定义在头文件中。用于表示某种特定类型的值的数组,和vector一样,initializer_list是一种模板类型。

#include <iostream>
#include <vector>
#include <initializer_list>

using namespace std;

class A
{
public:
	A(int a, int b){}
};

enum class Gender
{
	boy = 1,
	girl = 2,
};

class People
{
public:
	People(initializer_list<pair<string, Gender>> l)
	{
		initializer_list<pair<string, Gender>>::const_iterator iter = l.begin();
		for(; iter != l.end(); ++iter)
		{
			data.push_back(*iter);
		}
	}

private:
	vector<pair<string, Gender>> data;
};

int main()
{
	People pp = { {"aa", Gender::boy}, {"bb", Gender::girl} };
	return 0;
}

在上面的代码中,为这个类提供了一个initializer_list<pair<string, Gender>>模板版本的构造函数。这样就可以采用通过初始化列表的方式进行初始化了。

用于函数参数的初始化

initializer_list除了可以初始化还可以作为函数的参数列表,就可以让函数支持初始化列表。

#include <iostream>
#include <vector>
#include <initializer_list>

using namespace std;

void test(initializer_list<int> iv){}

int main()
{
	test({ 1,5,3,99 });
	test({ 1 });

	return 0;
}

在上面这个例子中,定义了一个接受初始化列表的函数test。这种方法不局限于全局函数,成员函数也是可以的。

用于重载运算符

initializer_list还可以用在重载下标运算符中operator[]

下面这个例子稍微复杂一点,但正因为复杂也能体现出初始化列表的便捷性

创建了一个类A,其中重载了下标运算符,赋值运算符。实现了一个可以通过下标运算符[]来对数组内的值进行批量初始化。

  1. 重载下标运算符的目的是将需要初始化的下表进行一个记录,以便后续的初始化工作。
  2. 重载赋值运算符的目的是将之前记录的所有需要初始化的索引进行一个循环初始化工作。
#include <iostream>
#include <vector>
#include <initializer_list>

using namespace std;

class A
{
public:
	/*
	 *  用于记录需要初始化的下表
	 */
	A& operator[](initializer_list<int> l)
	{
		for(initializer_list<int>::const_iterator iter = l.begin(); iter != l.end(); ++iter)
		{
			index.push_back(*iter);
		}
		return *this;
	}

	/*
	 *  用于将之前index提前保存好的下表进行统一初始化
	 */
	A& operator=(int v)
	{
		if(false == index.empty())
		{
			for (vector<int>::const_iterator iter = index.begin(); iter != index.end(); ++iter)
			{
				if (d.size() < *iter)
				{
					d.resize(*iter);
				}
				d.at(*iter - 1) = v;
			}
			index.clear();
			return *this;
		}
	}

	void Print()
	{
		for(const auto elem : d)
		{
			cout << elem << " ";
		}
		cout << endl;
	}

private:
	vector<int> index; // 辅助数组,用于记录index
	vector<int> d; 
};

int main()
{
	A a;

	a[{1, 5, 8, 4}] = 1;
	a.Print();

	a[{2, 1, 6, 9, 4}] = 6;
	a.Print();

	return 0;
}

可以看到我们自定义批量初始化仅需要一行即可完成a[{1, 5, 8, 4}] = 1;。可见初始化的灵活性、强大性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++11之初始化列表 的相关文章

随机推荐

  • Python中执行MySQL语句, 遇到同时有单引号, 双引号处理方式 !r, repr()

    SQL语句 insert cmd INSERT INTO 0 SET 1 format db conn firmware info table join 0 1 r format k str v for k v in info dict i
  • linux读取按行读写文本文件

    include
  • 迪杰斯特拉算法浅析

    所谓的迪杰斯特拉算法 就是一个用来求一个图中某点到其它点的最短路径的算法 大致方法 遍历所有节点 找到离起点最近的一个点 那么这个点到起点的最小距离肯定是起点到这个点的这条边的权值 然后标记这个点被使用过了 以1中的那个点为中继 更新其它节
  • 进程和线程的区别

    简介 进程 进程是计算机中运行程序的实例 是操作系统进行资源分配和调度的基本单位 每个进程都有独立的内存空间和系统资源 不同进程之间相互独立 彼此不能直接访问对方的内存 进程之间的通信需要通过操作系统提供的特定机制 如管道 共享内存等 个人
  • nginx 之安全配置

    前言 看官网官网 一 控制并发连接数 1 在默认发布目录新建一个目录并保存一张图片 传送文件到server1 打开浏览器就能看到图片 2 测试 查看日至情况 cat usr local nginx logs access log http状
  • 时间计时android程序,Android实现时间倒计时功能

    本文实例为大家分享了Android实现时间倒计时功能展示的具体代码 供大家参考 具体内容如下 效果展示 MainActivity 主页面代码 public class MainActivity extends Activity privat
  • Nacos配置中心落地与实践

    一 背景 目前 我们公司各团队配置中心使用各异 电商使用的是 Spring Cloud Config 支付使用的是 Apollo APP 团队使用的是 Apollo Nacos 为了更好地应对公司业务的发展 统一基础设施技术栈必不可少 图片
  • ChatGPT-Next-Web:Vercel 和 Cloudflare 的快速部署

    项目地址 GitHub Chanzhaoyu chatgpt web 用 Express 和 Vue3 搭建的同时支持 openAI Key 和 网页 accessToken 的 ChatGPT 演示网页 依赖安装 1 安装node cur
  • BI-SQL丨行列转换

    行列转换 行列转换 在SQL Server中属于常见的基本操作 无论是搭建数仓 还是通过PowerBI进行数据分析 我们总会接触到各式各样的数据源 而在这些数据源中 除了标准的大型数仓外 我们很少能够拿到标准规范的数据表结构 接触最多的 往
  • 最熟悉的陌生人:ListView 中的观察者模式

    http blog csdn net u011240877 article details 52683711 RecyclerView 得宠之前 ListView 可以说是我们用的最多的组件 之前一直没有好好看看它的源码 知其然不知其所以然
  • tar分卷压缩解压

    1 使用tar分卷压缩 格式 tar cvzf filedir split d b 50m filename 样例 tar cvzf dir split d b 10m dirname tar gz 将 dir 打包 并切割为 10m 的包
  • python——*和**

    python中 和 的使用分两个方面 一个是计算 另一个是参数传递过程中元素的打包和解包 计算中的运用 和 在python中最常见的作用分别是 相乘 和 乘幂 如下 gt gt gt a 2 gt gt gt b 3 gt gt gt c
  • 20个Android游戏源码,…

    原文地址 分享20个Android游戏源码 希望大家喜欢哈 作者 我算哪根葱 分享20个 Android 游戏源码 希望大家喜欢哈 http www apkbus com android 21834 1 1 html Android 疯狂足
  • 凸优化学习(三)——凸函数

    注意 本文内容来自于吴恩达老师cs229课堂笔记的中文翻译项目 https github com Kivy CN Stanford CS 229 CN 中的凸优化部分的内容进行翻译学习 3 凸函数 凸优化的一个核心要素是凸函数的概念 定义
  • vtm配置以及编码示例

    vtm配置以及编码示例 下载VTM源码 网址 VTM源码 选择对应的版本下载 版本从2 0到最新的版本 1 0版本的VTM需要使用HM的工具svn下载 VTM 1 0源码地址 https jvet hhi fraunhofer de svn
  • STM32F4 IAP 跳转 APP问题

    1 概念 IAP 的作用 网上其他资料已经有很多介绍了 这里放一个链接 不进行深入的介绍 本文的关注重点是Bootloader在跳转APP程序中出现的问题 IAP的实现原理讲解以及中断向量表的偏移 2 程序 本人主要做应用层的开发 所有Bo
  • python--判断奇数偶数

    num int input 输入一个数 if num 2 0 print 0 是偶数 format num else print 0 是奇数 format num 优化 while True try num int input 输入一个整数
  • TS中类型推论、类型别名和never类型

    一 类型推论 TypeScript会在没有明确的指定类型的时候推测出一个类型 这就是类型推论 如果没声明变量 没定义类型 也没赋值 这时候TS会推断成any类型可以进行任何操作 let str str 456 str null 二 类型别名
  • 5分钟 教你搭建个人博客

    链接 https www jianshu com p 4eaddcbe4d12 五分钟倒数已经可以计时了 三步完成免费个人博客搭建 这是一篇小白也能看懂的文章 本文主要针对mac OS Windows 除了软件安装方式和命令有些区别 装了g
  • C++11之初始化列表

    系列文章 C 11之正则表达式 regex match regex search regex replace C 11之线程库 Thread Mutex atomic lock guard 同步 C 11之智能指针 unique ptr s