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;
}

结果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/886307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

『VUE』27. 透传属性与inheritAttrs(详细图文注释)

目录 什么是透传属性&#xff08;Forwarding Attributes&#xff09;使用条件唯一根节点禁用透传属性继承总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 什么是透传属性&#xff08;Forwarding Attributes&#xff09; 在 V…

演员王子辰—专注革命题材 《前行者》后再出发

2021年10月22日在北京卫视播出的由张鲁一、聂远等人主演的电视剧《前行者》&#xff0c;讲述了在二十世纪三十年代初&#xff0c;因叛徒出卖&#xff0c;我上海地下党组织遭到严重破坏&#xff0c;革命事业陷入一片白色恐怖之中。我党情报员马天目刚从法国归来&#xff0c;临危…

【电脑】解决DiskGenius调整分区大小时报错“文件使用的簇被标记为空闲或与其它文件有交叉”

【电脑】解决DiskGenius调整分区大小时报错“文件使用的簇被标记为空闲或与其它文件有交叉” 零、报错 在使用DiskGenius对磁盘分区进行调整时&#xff0c;DiskGenius检查出磁盘报错&#xff0c;报错信息&#xff1a;文件使用的簇被标记为空闲或与其它文件有交叉&#xff0c;…

远程控制步骤

当远在千里之外的朋友想求助你帮他找到他电脑上的文件、或者是给他安装软件时。但是你给他说了他又找不到&#xff0c;那么这时你就可以通过控制对方的电脑去做一系列的操作。 如何远程控制对方的电脑非常关键。 方法一&#xff08;Windows自带远程桌面功能&#xff09;&#…

蓝桥杯——数组

1、移动数组元素 package day3;import java.util.Arrays;public class Demo1 {public static void main(String[] args) {int[] arr {1,2,3,4,5,6};int k 2;int[] arr_new f(arr,k);for (int i : arr_new) {System.out.print(i",");}//或System.out.println();St…

【大数据技术基础 | 实验十】Hive实验:部署Hive

文章目录 一、实验目的二、实验要求三、实验原理四、实验环境五、实验内容和步骤&#xff08;一&#xff09;安装部署&#xff08;二&#xff09;配置HDFS&#xff08;三&#xff09;启动Hive 六、实验结果&#xff08;一&#xff09;启动结果&#xff08;二&#xff09;Hive基…

MQTT从入门到精通之MQTT Dashboard

MQTT Dashboard 1 Dashboard简介 EMQX 提供了一个内置的管理控制台&#xff0c;即 EMQX Dashboard。方便用户通过 Web 页面就能轻松管理和监控 EMQX 集群&#xff0c;并配置和使用所需的各项功能。 访问地址&#xff1a;http://ip:18083 首次登录访问账号&#xff1a;admin…

[Codesys]常用功能块应用分享-BMOV功能块功能介绍及其使用实例说明

官方说明 功能说明 参数 类型 功能 pbyDataSrcPOINTER TO BYTE指向源数组指针uiSizeUINT要移动数据的BYTE数pbyDataDesPOINTER TO BYTE指向目标数组指针 实例应用-ST IF SYSTEM_CLOCK.AlwaysTrue THENCASE iAutoState OF0: //读写完成信号在下次读写信号的上升沿或复位信号…

推荐一款流程图和图表绘制工具:WizFlow Flowcharter Pro

WizFlow Flowcharter是一款易于使用、功能丰富的Windows流程图和图表绘制工具。它允许用户使用超过一百种预定义的形状和箭头定义形状“样式”。您可以将自己的样式保存在图表模板中&#xff0c;以建立自己的绘图方法。WizFlow附带了完整的流程图模板&#xff0c;以帮助您入门。…

Java集合 List——针对实习面试

目录 Java集合 ListJava List的三种主要实现是什么&#xff1f;它们各自的特点是什么&#xff1f;Java List和Array&#xff08;数组&#xff09;的区别&#xff1f;Java List和Set有什么区别&#xff1f;ArrayList和Vector有什么区别&#xff1f;什么是LinkedList&#xff1f;…

数据结构 -- 二叉搜索树

二叉搜索树 概念 二叉搜索树又称为二叉排序树&#xff0c;它或为空树&#xff0c;或为具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于等于根节点的值。若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于等于根节…

D3 可以加载的数据格式有哪些?(12种)

D3.js 支持多种数据格式&#xff0c;这些格式涵盖了从简单的表格数据到复杂的地理数据。以下是一些常见的数据格式及其加载方法&#xff1a; D3.js 数据加载方法 d3.blob(input, init) 用途: 加载二进制数据&#xff0c;返回一个 Blob 对象。参数: input: 数据源 URL。init: …

stm32在linux环境下的开发与调试

环境安装 注&#xff1a;文末提供一键脚本 下载安装stm32cubeclt 下载地址为&#xff1a;https://www.st.com/en/development-tools/stm32cubeclt.html 选择 linux版本下载安装 安装好后默认在家目录st下 > $ ls ~/st/stm32cubeclt_1.16.0 …

【从零开始的LeetCode-算法】3270. 求出数字答案

给你三个 正 整数 num1 &#xff0c;num2 和 num3 。 数字 num1 &#xff0c;num2 和 num3 的数字答案 key 是一个四位数&#xff0c;定义如下&#xff1a; 一开始&#xff0c;如果有数字 少于 四位数&#xff0c;给它补 前导 0 。答案 key 的第 i 个数位&#xff08;1 < …

蓝桥杯每日真题 - 第12天

题目&#xff1a;&#xff08;数三角&#xff09; 题目描述&#xff08;14届 C&C B组E题&#xff09; 解题思路&#xff1a; 给定 n 个点的坐标&#xff0c;计算其中可以组成 等腰三角形 的三点组合数量。 核心条件&#xff1a;等腰三角形的定义是三角形的三条边中至少有…

项目技术栈-解决方案-注册中心

项目技术栈-解决方案-注册中心 ZookeeperEureka、Nacos、Consul和Etcd参考文章 服务注册中心&#xff08;Registry&#xff09;&#xff1a;用于保存 RPC Server 的注册信息&#xff0c;当 RPC Server 节点发生变更时&#xff0c;Registry 会同步变更&#xff0c;RPC Client 感…

uniapp适配暗黑模式配置plus.nativeUI.setUIStyle适配DarkMode配置

uniapp适配暗黑模式配置 目录 uniapp适配暗黑模式配置setUIStyleDarkMode 适配app-plus manifest.json配置theme.json配置pages.json配置页面切换代码实现同步手机暗黑配置额外适配 参考官方文档&#xff1a;https://uniapp.dcloud.net.cn/tutorial/darkmode.html 主要用到api…

Wireshark中的length栏位

注&#xff1a;Ethernet II的最小data length为46&#xff0c;如果小于&#xff0c;会补全到46. 1.指定网卡抓取的&#xff0c;链路为ethernet。 IPv4 Ethernet II 长度为 14 bytes - L1ipv4 header中的length包括header和payload的总长度 - L2wireshark中length表示抓取的pac…

前端开发迈向全栈之路:规划与技能

一、前端开发与全栈开发的差异 前端开发主要负责构建和实现网页、Web 应用程序和移动应用的用户界面。其工作重点在于网页设计和布局&#xff0c;使用 HTML 和 CSS 技术定义页面的结构、样式和布局&#xff0c;同时运用前端框架和库如 React、Angular 或 Vue.js 等构建交互式和…

ISUP协议视频平台EasyCVR视频设备轨迹回放平台智慧农业视频远程监控管理方案

在当今快速发展的农业领域&#xff0c;智慧农业已成为推动农业现代化、助力乡村全面振兴的新手段和新动能。随着信息技术的持续进步和城市化进程的加快&#xff0c;智慧农业对于监控安全和智能管理的需求日益增长。 视频设备轨迹回放平台EasyCVR作为智慧农业视频远程监控管理方…