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.pswp.cn/diannao/70917.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70917.shtml
英文地址,請注明出處:http://en.pswp.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…