c++中打印任意类型任意长度数组的各种方式

目录

一、代码

二、详细解释

1. print 函数模板

2. array_size 函数模板

3. print1 函数模板

4. print2 函数模板

5. my_begin 和 my_end 函数模板

6. print3 函数模板

7. main 函数

总结


一、代码

如下代码给出了5种方式打印任意类型任意长度的数组。这段代码定义了多个模板函数,用于处理数组的相关操作,包括计算数组大小、打印数组元素等。在 main 函数中,创建了一个整数数组 a 和一个字符串数组 vs,并使用不同的方式计算数组大小和打印数组元素。

#include<iostream>
#include<string>template<typename T>
void print(const T* begin,const T* end)
{while(begin != end)std::cout<<*begin++<<" ";std::cout<<std::endl;
}template<typename T>
void print(const T ta[],size_t size)
{for(size_t i = 0;i != size; i++)std::cout<<ta[i]<<" ";std::cout<<std::endl;
}template<typename T,unsigned int N>
constexpr unsigned int array_size(const T (&arr)[N])
{return N;
}template<typename T,unsigned int N>
void print1(const T (&arr)[N])
{for(size_t i = 0;i < N;i++)std::cout<<arr[i]<<" ";std::cout<<std::endl;
}template<typename T,unsigned int N>
void print2(const T (&arr)[N])
{for(const auto &e : arr)std::cout<<e<<" ";std::cout<<std::endl;
}template<typename T,unsigned int N>
const T* my_begin(const T (&arr)[N])
{return &arr[0];
}template<typename T,unsigned int N>
const T* my_end(const T (&arr)[N])
{return arr + N;
}template<typename T,unsigned int N>
void print3(const T (&arr)[N])
{for(auto it = my_begin(arr);it != my_end(arr);it++)std::cout<<*it<<" ";std::cout<<std::endl;
}int main(int argc, char* argv[])
{int a[6] = {0,2,4,6,8,10};std::string vs[3] = {"Hello","World","!"};std::cout<<"1 size of a is:"<<array_size(a)<<std::endl;std::cout<<"2 size of a is:"<<sizeof(a)/sizeof(int)<<std::endl;std::cout<<"3 size of a is:"<<std::end(a) - std::begin(a)<<std::endl;std::cout<<"4 size of a is:"<<my_end(a) - my_begin(a)<<std::endl;std::cout<<"1-----------------------"<<std::endl;print(std::begin(a),std::end(a));print(std::begin(vs),std::end(vs));std::cout<<"2-----------------------"<<std::endl;print(a,std::end(a) - std::begin(a));print(vs,std::end(vs) - std::begin(vs));std::cout<<"3-----------------------"<<std::endl;print1(a);print1(vs);std::cout<<"4-----------------------"<<std::endl;print2(a);print2(vs);std::cout<<"5-----------------------"<<std::endl;print3(a);print3(vs);return 0;
}

输出

1 size of a is:6
2 size of a is:6
3 size of a is:6
4 size of a is:6
1-----------------------
0 2 4 6 8 10 
Hello World ! 
2-----------------------
0 2 4 6 8 10 
Hello World ! 
3-----------------------
0 2 4 6 8 10 
Hello World ! 
4-----------------------
0 2 4 6 8 10 
Hello World ! 
5-----------------------
0 2 4 6 8 10 
Hello World ! 

print1和print2只需要传入数组就可以。推荐使用。

二、详细解释

1. print 函数模板

template<typename T>
void print(const T* begin, const T* end)
{while(begin != end)std::cout << *begin++ << " ";std::cout << std::endl;
}
  • 该函数接受两个指向数组元素的指针 begin 和 end,通过遍历从 begin 到 end 的元素,将其输出到标准输出流,并在最后换行。
template<typename T>
void print(const T ta[], size_t size)
{for(size_t i = 0; i != size; i++)std::cout << ta[i] << " ";std::cout << std::endl;
}
  • 此函数接受一个数组 ta 和数组的大小 size,通过循环遍历数组元素并输出,最后换行。

2. array_size 函数模板

template<typename T, unsigned int N>
constexpr unsigned int array_size(const T (&arr)[N])
{return N;
}
  • 该函数接受一个数组的引用 arr,利用模板参数 N 来获取数组的大小,并返回该大小。constexpr 表示该函数可以在编译时求值。

3. print1 函数模板

template<typename T, unsigned int N>
void print1(const T (&arr)[N])
{for(size_t i = 0; i < N; i++)std::cout << arr[i] << " ";std::cout << std::endl;
}
  • 该函数接受一个数组的引用 arr,通过循环遍历数组元素并输出,最后换行。

4. print2 函数模板

template<typename T, unsigned int N>
void print2(const T (&arr)[N])
{for(const auto &e : arr)std::cout << e << " ";std::cout << std::endl;
}
  • 此函数使用范围 for 循环遍历数组 arr 中的每个元素 e,并将其输出到标准输出流,最后换行。

5. my_begin 和 my_end 函数模板

template<typename T, unsigned int N>
const T* my_begin(const T (&arr)[N])
{return &arr[0];
}template<typename T, unsigned int N>
const T* my_end(const T (&arr)[N])
{return arr + N;
}
  • my_begin 函数返回数组 arr 的第一个元素的地址。
  • my_end 函数返回数组 arr 最后一个元素之后的地址。

6. print3 函数模板

template<typename T, unsigned int N>
void print3(const T (&arr)[N])
{for(auto it = my_begin(arr); it != my_end(arr); it++)std::cout << *it << " ";std::cout << std::endl;
}
  • 该函数使用自定义的 my_begin 和 my_end 函数来获取数组的起始和结束指针,通过指针遍历数组元素并输出,最后换行。

7. main 函数

int main(int argc, char* argv[])
{int a[6] = {0, 2, 4, 6, 8, 10};std::string vs[3] = {"Hello", "World", "!"};std::cout << "1 size of a is:" << array_size(a) << std::endl;std::cout << "2 size of a is:" << sizeof(a) / sizeof(int) << std::endl;std::cout << "3 size of a is:" << std::end(a) - std::begin(a) << std::endl;std::cout << "4 size of a is:" << my_end(a) - my_begin(a) << std::endl;std::cout << "1-----------------------" << std::endl;print(std::begin(a), std::end(a));print(std::begin(vs), std::end(vs));std::cout << "2-----------------------" << std::endl;print(a, std::end(a) - std::begin(a));print(vs, std::end(vs) - std::begin(vs));std::cout << "3-----------------------" << std::endl;print1(a);print1(vs);std::cout << "4-----------------------" << std::endl;print2(a);print2(vs);std::cout << "5-----------------------" << std::endl;print3(a);print3(vs);return 0;
}
  • 在 main 函数中,创建了一个整数数组 a 和一个字符串数组 vs
  • 使用不同的方式计算数组 a 的大小并输出。
  • 分别使用不同的 print 函数模板来打印数组 a 和 vs 的元素。

总结

这段代码展示了如何使用模板函数来处理数组的大小计算和元素打印,同时演示了不同的遍历数组的方式。通过使用模板函数,可以提高代码的复用性,使其适用于不同类型的数组。

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

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

相关文章

ubuntu下r8125网卡重启丢失修复案例一则

刚装的一台服务器&#xff0c;ubuntu24.04&#xff0c;主板网卡是r8125&#xff0c;安装服务后会莫名其妙丢失驱动 按照官网的方法下载最新8125驱动包&#xff1a; Realtek 然后卸载驱动 rmmod r8125 然后在驱动包里安装&#xff08;幸好我之前装了build-essential&#x…

[Python学习日记-84] 进程理论

[Python学习日记-84] 进程理论 简介 进程的概念 并发与并行的区别 进程并发的实现 简介 进程理论是计算机科学中一种重要的概念&#xff0c;用来描述操作系统中执行的程序实例。在操作系统中&#xff0c;每个程序的执行被称为一个进程。进程理论研究进程的创建、调度、通信…

云创智城YunCharge 新能源二轮、四轮充电解决方案(云快充、万马爱充、中电联、OCPP1.6J等多个私有单车、汽车充电协议)之新能源充电行业系统说明书

云创智城YunCharge 新能源充电行业系统说明书 ⚡官方文档 ⚡官网地址 1. 引言 随着全球环境保护和能源危机的加剧&#xff0c;新能源汽车行业得到了快速发展&#xff0c;充电基础设施建设也随之蓬勃发展。新能源充电行业系统旨在提供高效、便捷的充电服务&#xff0c;满足电…

OpenWebUI配置异常的外部模型导致页面无法打开

一、使用Ollama关闭OpenAI OpenWebUI自带OpenAI的API设置&#xff0c;且默认是打开的&#xff0c;默认情况下&#xff0c;启动后&#xff0c;会不断的去连https://api.openai.com/v1&#xff0c;但是无法连上&#xff0c;会报错&#xff0c;但是不会影响页面&#xff0c;能正常…

RuntimeWarning: invalid value encountered in scalar power在进行标量的幂运算时遇到了无效值

year_profit ((profit / initial_cash) ** (1 / yy) - 1) * 100 RuntimeWarning: invalid value encountered in scalar power 这个警告表示在执行标量幂运算 ((profit / initial_cash) ** (1 / yy) - 1) * 100 时遇到了无效值。常见的引发原因及解决办法如下&#xff1a; ###…

计算机毕业设计 ——jspssm506Springboot 的旧物置换网站

&#x1f4d8; 博主小档案&#xff1a; 花花&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 花花在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于java、python等技术。近年来&#xff0c;花花更…

Kafka消费者相关

Kafka生产者相关-CSDN博客 消费者消费数据基本流程 package com.hrui;import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache…

【软考-架构】备战2025软考

新老教材对比 科目1&#xff08;信息系统综合&#xff09;考点详解 科目2&#xff08;系统架构设计案例&#xff09;考点详解 科目3&#xff08;系统架构设计论文&#xff09;考点详解 趋于越来越具体 学习方法推荐 第一阶段 – 基础知识阶段 建议一个半月&#xff1b; 先过…

MMW-1碳棒磨损机设计

摘 要 为了更好的测量在一定压力下碳棒的磨损量&#xff0c;提高碳棒磨损量的测量精度&#xff0c;本文设计了一种MMW-1碳棒磨损机&#xff0c;该碳棒磨损机属于柱盘式摩擦磨损试验机的一种。该机器主要用于做和碳棒有关的摩擦磨损试验&#xff0c;可以更准确的获得相关的参数…

网络运维学习笔记(DeepSeek优化版)005网工初级(HCIA-Datacom与CCNA-EI)链路层发现协议与VLAN技术

文章目录 一、链路层发现协议1.1 思科CDP协议1.2 华为LLDP协议 二、VLAN&#xff08;Virtual Local Area Network&#xff0c;虚拟局域网&#xff09;技术详解2.1 基本概念2.2 技术特性2.3 接口工作原理2.3.1 Access模式2.3.2 Trunk模式 2.4 厂商配置对比思科配置华为配置 2.5 …

SOME/IP-SD -- 协议英文原文讲解5

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.2.5 S…

APNG格式图片文件大小优化方案 转WEBP

文章目录 原因过程相关下载相关文档后记 原因 页面上有个特效动画&#xff0c;PNG文件&#xff0c;APNG格式&#xff0c;13M大小&#xff0c;太占用内容了&#xff0c;要优化一下。 过程 直接上命令吧 ffmpeg -i input.apng -vf "formatrgba" -loop 0 output.web…

个人电脑小参数GPT预训练、SFT、RLHF、蒸馏、CoT、Lora过程实践——MiniMind图文版教程

最近看到Github上开源了一个小模型的repo&#xff0c;是真正拉低LLM的学习门槛&#xff0c;让每个人都能从理解每一行代码&#xff0c; 从零开始亲手训练一个极小的语言模型。开源地址&#xff1a; GitHub - jingyaogong/minimind: &#x1f680;&#x1f680; 「大模型」2小时…

PHP Zip 文件处理指南

PHP Zip 文件处理指南 引言 ZIP文件是一种流行的压缩格式&#xff0c;广泛用于文件压缩和归档。PHP作为一门强大的服务器端脚本语言&#xff0c;提供了丰富的类和方法来处理ZIP文件。本文将详细介绍PHP中ZIP文件的处理方法&#xff0c;包括创建、添加文件、提取文件以及压缩和…

Java使用ZXing库生成带有Logo的二维码图片,并去除白边动态伸缩上传到阿里云OSS

文章目录 引言二维码基本原理1、二维码概述2、QR Code结构3、错误纠正级别 QR Code生成技术1、ZXing库2、生成二维码的步骤 图像处理技术1、嵌入Logo2. 去除白边 阿里云OSS基本概念1、OSS概述2. 主要功能3. 基本概念 实战演示1、依赖库2、类结构3、生成普通二维码4. 去除白边5、…

AI工具箱最新使用教程

先克隆项目 电脑需要先安装 git &#xff0c;安装的画看这个 Git安装教程&#xff08;超详细&#xff09;。 git镜像 git clone https://github.com/Escaflowne1985/MyToolsWebBackendUser.gitgitee镜像 git clone https://gitee.com/escaflowne/MyToolsWebBackendUser.git…

Android-创建mipmap-anydpi-v26的Logo

利用 Android Studio 自动创建 创建新项目&#xff1a;打开 Android Studio&#xff0c;点击 “Start a new Android Studio project” 创建新项目。在创建项目的过程中&#xff0c;当设置Target SDK Version为 26 或更高版本时&#xff0c;Android Studio 会在项目的res目录下…

SEO炼金术(4)| Next.js SEO 全攻略

在上一篇文章 SEO炼金术&#xff08;3&#xff09;| 深入解析 SEO 关键要素 中&#xff0c;我们深入解析了 SEO 关键要素&#xff0c;包括 meta 标签、robots.txt、canonical、sitemap.xml 和 hreflang&#xff0c;并探讨了它们在搜索引擎优化&#xff08;SEO&#xff09;中的作…

面试葵花宝典之React(持续更新中)

1.谈谈你对HOC的理解 定义&#xff1a; 高阶组件是一个接收组件作为参数并返回新组件的函数&#xff0c;用于复用组件逻辑&#xff0c;遵循纯函数特性&#xff08;无副作用&#xff0c;输出仅依赖输入&#xff09;。 组合性&#xff1a;可嵌套使用多个 HOC。 HOC&#xff08;…

数据安全管理的AI工具有哪些?

数据安全管理的AI工具在不断演进&#xff0c;它们凭借强大的算法和学习能力&#xff0c;为企业筑起了一道坚不可摧的数字防线。 在数据安全管理领域&#xff0c;AI工具的应用日益广泛&#xff0c;以下是一些常见的工具及其功能&#xff1a; AI驱动的数据分类与标记 工具: Micr…