当前位置: 首页 > article >正文

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  /  tie
	std::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_pair
	auto 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.kler.cn/a/396522.html

相关文章:

  • 从电动汽车到车载充电器:LM317LBDR2G 线性稳压器在汽车中的多场景应用
  • CSS基础知识01
  • Python读写Excel的全面教程
  • DB-GPT系列(四):DB-GPT六大基础应用场景part1
  • centos rich 美观打印日志
  • 【问卷调研】HarmonyOS SDK开发者社区用户需求有奖调研
  • vue2将webpack改为vite
  • 《Kotlin实战》-附录
  • 大数据实验9:Spark安装和编程实践
  • Jackson与GSON的深度对比
  • mybatis-plus: mapper-locations: “classpath*:/mapper/**/*.xml“配置!!!解释
  • 初学人工智不理解的名词3
  • 释放高级功能:Nexusflows Athene-V2-Agent在工具使用和代理用例方面超越 GPT-4o
  • 从电动汽车到车载充电器:LM317LBDR2G 线性稳压器在汽车中的多场景应用
  • springboot实现简单的数据查询接口(无实体类)
  • Java项目实战II基于微信小程序的订餐系统(开发文档+数据库+源码)
  • 本机ip地址和网络ip地址一样吗
  • AI服务器SAS硬盘汰换与数据抹除指南
  • HarmonyOS ArkUI(基于ArkTS) 开发布局 (中)
  • 基于STM32智能电流表
  • Python酷库之旅-第三方库Pandas(218)
  • 探索 TraceBoard:统计你的键盘按键使用情况
  • android应用调用c语言的so库
  • 专业140+总分400+南京大学851信号与系统考研经验南大电子信息通信工程集成电路,真题,大纲,参考书。
  • 华为云前台用户可挂载数据盘和系统盘是怎么做到的?
  • 计算机组成原理对于学习嵌入式开发的意义