C/C++语言基础--initializer_list表达式、tuple元组、pair对组简介
本专栏目的
- 更新C/C++的基础语法,包括C++的一些新特性
前言
- initializer_list表达式、tuple元组、pair对组再C++日常还是比较常用的,尤其是对组在刷算法还是挺好用的,这里做一个简介;
- 这三个语法结合C++17的结构化绑定会更好用,结构化绑定后面会更新;
- C语言后面也会继续更新知识点,如内联汇编;
- 欢迎收藏 + 关注,本人将会持续更新。
文章目录
- std::initializer_list
- 使用步骤
- std::tuple
- 创建
- 获取元素值
- 作为函数返回值
- std::pair
std::initializer_list
为了编写能够处理不同数量实参,但是类型相同,C++11新标准提供了std::initializer_list的方法,它提供了一种方便的方式来初始化容器或执行其他形式的初始化。std::initializer_list 主要用于构造函数和其他函数的参数列表中,允许使用大括号 {} 包围的初始化列表来传递多个元素。
- 普通函数使用
void showMsg(const std::initializer_list<std::string>& list)
{for (auto& n : list){cout << n << " ";}cout << endl;
}
showMsg({ "hello","world","嘿嘿"});
- 构造函数使用
template<typename T,size_t _size>
class Array
{
public:Array() {}Array(const std::initializer_list<T>& list) {size_t i = 0;for (auto& v : list) //必须使用这个{_arr[i++] = v;}}constexpr size_t size()const { return _size; }T& operator[](int index){return _arr[index];}T _arr[_size]{ T() };
};Array<int, 10> arr = { 1,2,3,4,5,6 };
for (int i = 0; i < arr.size(); i++)
{cout << arr[i] << " ";
}
注意: 这个表达式只允许读,不允许修改里面元素;
相对于数组:语法简单,可以支持{}初始化,也更安全了。
使用步骤
1、用花括号初始化器列表列表初始化一个对象,其中对应构造函数接受一个std::initializer_list 参数
2、以花括号初始化器列表为赋值的右运算数,或函数调用参数,而对应的赋值运算符/函数接受 std::initializer_list 参数
3、绑定花括号初始化器列表到 auto ,包括在范围 for 循环中
std::tuple
😋 简介:元组,可以存储多个元素,包括不同类型的元素;
创建
void create()
{//1.模板std::tuple<int, const char*, const char*> tup(18, "wy", "wqy");//2.构造函数(推荐)auto m_tup = std::make_tuple(18, "wy love", "wqy");//3.右值引用auto m_right = std::forward_as_tuple(18, "wy love", "wqy");
}
获取元素值
🔐 可以通过std::get来获取
void print()
{auto m_tup = std::make_tuple(18, "wy", "love", "wqy");//1.get 获取,可以改变值std::get<0>(m_tup) = 19;std::cout << std::get<0>(m_tup) << " " << std::get<1>(m_tup) << " " << std::get<2>(m_tup) << " " << std::get<3>(m_tup) << std::endl;//2.tie 获取int age;const char* name;const char* word;const char* she;std::tie(age, name, word, she) = m_tup;std::cout << age << " " << name << " " << word << " " << she << std::endl;std::string na;std::tie(std::ignore, std::ignore, na, std::ignore) = m_tup; //得需要完整的参数个数//3.tie 还可以创建一个tuple ,但是必须为左值auto m_tp = std::tie(word, she);//4. std::tie_cat 连接auto new_tup = std::tuple_cat(m_tup, m_tp);//输出 get / tiestd::cout << std::get<0>(new_tup) << " " << std::get<5>(new_tup) << std::endl;
}
作为函数返回值
#include<iostream>
#include<tuple>auto show()
{return std::make_tuple(1, 2, 3);
}int main()
{print();//作用:可以做函数多个参数返回值int x, y, z;auto m_tup = show();std::tie(x, y, z) = show();std::cout << x << " " << y << " " << z << std::endl;return 0;
}
std::pair
简介: 这个用处还是很大的,可以存储两个元素,类似于KV存储。
📖 常用操作
- 构建对组
- 访问对组元素,第一个
.first,第二个.second - 常用操作代码:
#include<iostream>void createText();//用处
auto _with()
{return std::make_pair(1, 2);
}int main()
{createText();auto text = _with();std::cout << text.first << " " << text.second << std::endl;return 0;
}void createText()
{//pair 对组 //first second//1. 模板构造std::pair<std::string, std::string> m_pair("wy", "wqy");//2. make_pairauto m_p = std::make_pair("wqy", "wy");输出std::cout << m_pair.first << " " << m_pair.second << std::endl; std::cout << m_p.first << " " << m_p.second << std::endl;
}
注意,对 对组 元素进行排序,则默认按照第一个元素进行排序,代码如下:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;int main()
{std::vector<std::pair<int, std::string>> kv{ {10, "y"},{19, "x"},{18, "z"},{1, "b"},{22,"k"} };sort(kv.begin(), kv.end());for (auto& it : kv) {std::cout << it.first << " " << it.second << std::endl;}return 0;
}
⛑ 结果:

如果想要按照第二个排序,则需要需要用介词函数,什么是介词函数??这个等到STL的时候在讲解吧,代码如下:
#include <iostream>
#include <algorithm>
#include <vector>int main()
{std::vector<std::pair<int, std::string>> kv{ {10, "y"},{19, "x"},{18, "z"},{1, "b"},{22,"k"} };sort(kv.begin(), kv.end(), [=](const std::pair<int, std::string>& a, const std::pair<int, std::string>& b) {return a.second < b.second;});for (auto& it : kv) {std::cout << it.first << " " << it.second << std::endl;}return 0;
}
结果:

相关文章:
C/C++语言基础--initializer_list表达式、tuple元组、pair对组简介
本专栏目的 更新C/C的基础语法,包括C的一些新特性 前言 initializer_list表达式、tuple元组、pair对组再C日常还是比较常用的,尤其是对组在刷算法还是挺好用的,这里做一个简介;这三个语法结合C17的结构化绑定会更好用ÿ…...
paddle表格识别数据制作
数据格式 其中主要数据有两个一个表格结构的检测框,一个是tokens,注意的地方是 1、只能使用双引号,单引号不行 2、使用带引号的地方是tokens里面 "<tr>", "<td", " colspan2", ">",&quo…...
python selenium库的使用:通过兴趣点获取坐标
通过兴趣点获取坐标 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.common.exceptions import TimeoutException# 保存Cookies到文件(可选) import pi…...
如何优化Kafka消费者的性能
要优化 Kafka 消费者性能,你可以考虑以下策略: 并行消费:通过增加消费者组中的消费者数量来并行处理更多的消息,从而提升消费速度。 批量消费:配置 fetch.min.bytes 和 fetch.max.wait.ms 参数来控制批量消费的大小和…...
机器学习 决策树
决策树-分类 1 概念 1、决策节点通过条件判断而进行分支选择的节点。如:将某个样本中的属性值(特征值)与决策节点上的值进行比较,从而判断它的流向。 2、叶子节点没有子节点的节点,表示最终的决策结果。 3、决策树的深度所有节点的最大层…...
效益登记册效益管理计划
效益登记册 benefit Register效益管理计划效益登记册汇集并列出项目集计划的效益,用于在项目集的整个持续时间内测量和沟通效益的交付。在效益识别阶段,效益登记册根据项目集商业论证、组织战略计划和其他相关项目集自标而编制。随后,登记册由…...
Go语言的零值可用性:优势与限制
Go语言以其简洁和高效的设计理念而著称,其中之一便是“零值可用”的特性。这一特性使得许多类型在未显式初始化时即可直接安全地使用,大大简化了代码的初始化过程。然而,并非所有类型都支持零值可用,且在使用时也存在一定的限制。…...
【自用】0-1背包问题与完全背包问题的Java实现
引言 背包问题是计算机科学领域的一个经典优化问题,分为多种类型,其中最常见的是0-1背包问题和完全背包问题。这两种问题的核心在于如何在有限的空间内最大化收益,但它们之间存在一些关键的区别:0-1背包问题允许每个物品只能选择…...
HTML5实现俄罗斯方块小游戏
文章目录 1.设计来源1.1 主界面1.2 皮肤风格1.2 游戏中界面1.3 游戏结束界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/143788449 HTML5实现俄罗斯方块小游戏&#x…...
Mybatis官方生成器使用示例
在这篇文章中,我们将通过实际代码示例来说明如何使用 MyBatis Generator (MBG) 来自动化生成 MyBatis 项目所需的实体类、Mapper 接口和 Mapper XML 文件。我们将使用一个 Maven 插件来执行代码生成,并提供详细的配置和解释。 1. MyBatis Generator 简介…...
演员王子辰—专注革命题材 《前行者》后再出发
2021年10月22日在北京卫视播出的由张鲁一、聂远等人主演的电视剧《前行者》,讲述了在二十世纪三十年代初,因叛徒出卖,我上海地下党组织遭到严重破坏,革命事业陷入一片白色恐怖之中。我党情报员马天目刚从法国归来,临危…...
Spring Boot基础教学:创建第一个Spring Boot项目
使用Spring Initializr生成项目 Spring Initializr是一个在线工具,用于快速生成Spring Boot项目的基本结构。以下是使用Spring Initializr创建项目的步骤: 步骤1:访问Spring Initializr 打开网址 start.spring.io。 步骤2:选择…...
基于SpringBoot+Vue实现校园多媒体信息共享平台
作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验,被多个学校常年聘为校外企业导师,指导学生毕业设计并参与学生毕业答辩指导,…...
WebRTC API分析
主题 本文详细描述常用的webrtc api 媒体协商类 myPeerConnection.createOffer([options]); var options { offerToReceiveAudio: true, // 告诉另一端,你是否想接收音频,默认true offerToReceiveVideo: true, // 告诉另一端&a…...
ArkTS学习笔记:ArkTS起步
ArkTS是HarmonyOS的主力应用开发语言,基于TypeScript扩展,强化了静态检查和分析,旨在提升程序稳定性和性能。它采用静态类型,禁止运行时改变对象布局,并对UI开发框架能力进行扩展,支持声明式UI描述和自定义…...
spring-gateway网关聚合swagger实现多个服务接口切换
前提条件 微服务已经集成了swagger,并且注册进了nacos。 gateway配置 package com.zmy.springcloud.config;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springfra…...
关于 Oracle Database Express Edition 的功能和安装
Oracle Database Express Edition,简称 Oracle Database XE。是一个免费的版本,主要用于培训和一些功能要求比较简单,又需要免费分发的场景。 看看官方的说明: Whether you are a developer, a DBA, a data scientist, an educat…...
领夹麦克风哪个品牌好,手机领夹麦克风哪个牌子好,选购推荐
无线麦克风凭借其无与伦比的便携性与灵活性,成为在演讲、表演以及会议等多种场合中不可或缺的有力帮手。它挣脱了线缆的束缚,使得声音的传播更加自由自在。其操作十分简便,只需简单配对就能投入使用,从而可以轻松地适应各类场景…...
什么是 Go 语言?
Go 语言(也称为 Golang)是由 Google 开发的一种开源编程语言。它最初由 Rob Pike、Ken Thompson 和 Robert Griesemer 等人于 2007 年设计,经过两年的研发,于 2009 年首次公开发布。Go 语言的设计目标是提高编程效率,特…...
AI 大模型重塑软件开发流程:定义、应用、优势与挑战
随着人工智能技术的飞速发展,AI 大模型正在深刻影响软件开发的各个环节。从代码自动生成到智能测试,AI 大模型不仅提高了开发效率,还带来了全新的开发模式和流程变化。本文将从 AI 大模型的定义、应用场景、优势以及挑战等方面,探…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
