C/C++语言基础--initializer_list表达式、tuple元组、pair对组简介

本专栏目的

  • 更新C/C++的基础语法,包括C++的一些新特性

前言

  • initializer_list表达式、tuple元组、pair对组再C++日常还是比较常用的,尤其是对组在刷算法还是挺好用的,这里做一个简介;
  • 这三个语法 结合C++17的结构化绑定 会更好用,结构化绑定后面会更新;
  • C语言后面也会继续更新知识点,如内联汇编;
  • 欢迎收藏 + 关注,本人将会持续更新。

文章目录

std::initializer_list

为了编写能够处理不同数量实参,但是类型相同,C++11新标准提供了std::initializer_list的方法,它提供了一种方便的方式来初始化容器或执行其他形式的初始化。std::initializer_list 主要用于构造函数和其他函数的参数列表中,允许使用大括号 {} 包围的初始化列表来传递多个元素。

  • 普通函数使用
cpp 复制代码
void showMsg(const std::initializer_list<std::string>& list)
{
	for (auto& n : list)
	{
		cout << n << " ";
	}
	cout << endl;
}
showMsg({ "hello","world","嘿嘿"});
  • 构造函数使用
cpp 复制代码
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

😋 简介:元组,可以存储多个元素,包括不同类型的元素;

创建

cpp 复制代码
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来获取

cpp 复制代码
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;
}

作为函数返回值

C++ 复制代码
#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
  • 常用操作代码:
C++ 复制代码
#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;
}

注意 ,对 对组 元素进行排序,则默认按照第一个元素进行排序,代码如下:

cpp 复制代码
#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的时候在讲解吧,代码如下:

cpp 复制代码
#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;
}

结果:

相关推荐
叶浩成5201 分钟前
vue2+a-table——实现框选选中功能——js技能提升
开发语言·前端·javascript
luky!2 分钟前
算法--解决二叉树遍历问题
开发语言·python·算法
摆烂小白敲代码5 分钟前
【机器学习】K近邻算法
c++·人工智能·算法·机器学习·近邻算法
《源码好优多》6 分钟前
基于Java Springboot校园共享单车
java·开发语言·spring boot
Padid6 分钟前
SRP 实现 Cook-Torrance BRDF
c++·笔记·unity·游戏程序·图形渲染·着色器
Vec[95]14 分钟前
Opengl光照测试
c++·数码相机·算法
HenCoder17 分钟前
【泛型 Plus】Kotlin 的加强版类型推断:@BuilderInference
android·java·开发语言·kotlin
susu108301891120 分钟前
vscode执行npm install报错
ide·vscode·npm
孤寂码农_defector27 分钟前
C++清除所有输出【DEV-C++】所有编辑器通用 | 算法基础NO.1
数据结构·c++·算法·编辑器
oioihoii35 分钟前
设计模式概述
java·c++·设计模式·面试·c#·大学必学