带vector<T>的模板函数

2023-11-05

    若两个函数的逻辑相同,但参数类型不同,则可以把这2个函数合并为一个模板函数,有利于精简代码和提高可读性。
    比如,

  • 函数A: 将CString的三个动态数组:vector<CString> left,mid,right合并为一个;
  • 函数B: 将double的三个动态数组:vector<double> left,mid,right合并为一个;

    函数A、B的功能都是合并3个vector,只有函数参数不同,则可以用模板函数来代替原始的A、B,代码更加简洁,具体如下:

1 原始函数

1.1 将3个CString类型的vector<>合并

void MergeData(vector<CString>& data,const vector<CString>& left, const vector<CString>& mid, const vector<CString>& right)
{
	data.insert(data.end(), left.begin(),  left.end());
	data.insert(data.end(), mid.begin(),   mid.end());
	data.insert(data.end(), right.begin(), right.end());
}

1.2 将3个double类型的vector<>合并

void MergeData(vector <double>& data, const vector<double>& left, const vector<double>& mid, const vector<double>& right)
{
	data.insert(data.end(), left.begin(),  left.end());
	data.insert(data.end(), mid.begin(),   mid.end());
	data.insert(data.end(), right.begin(), right.end());
}

2 升级为模板函数

template <typename T>
inline void MergeData(vector<T>& data, const vector<T>& left, const vector<T>& mid, const vector<T>& right)
{
	data.insert(data.end(), left.begin(),  left.end());
	data.insert(data.end(), mid.begin(),   mid.end());
	data.insert(data.end(), right.begin(), right.end());
}

3 测试方法

//test.cpp

//模板函数
template <typename T>
inline void MergeData(vector<T>& data, const vector<T>& left, const vector<T>& mid, const vector<T>& right)
{
	data.insert(data.end(), left.begin(),  left.end());
	data.insert(data.end(), mid.begin(),   mid.end());
	data.insert(data.end(), right.begin(), right.end());
}

//测试函数
void TestMerge1()
{
	//1)字符串
	vector<CString> data;
	vector<CString> left  = { _T("dx1"),_T("dy1"),_T("dz1") };
	vector<CString> mid   = { _T("dx2"),_T("dy2"),_T("dz2") };
	vector<CString> right = { _T("dx3"),_T("dy3"),_T("dz3") };
	MergeData(data, left, mid, right);
	CString strLine;
	for (int i = 0; i < (int)data.size(); i++)
	{
		strLine += data[i] + _T(" ");
		if (i == data.size() - 1)
		{
			strLine += _T("\r\n");
			OutputDebugString(strLine);
		}
	}

	//2)数据
	vector<double> data2;
	vector<double> left2  = { 110,120,130 };
	vector<double> mid2   = { 310,320,330 };
	vector<double> right2 = { 510,520,530 };
	MergeData(data2, left2, mid2, right2);
	CString strRow;
	for (int i = 0; i < (int)data2.size(); i++)
	{
		CString strItem;
		strItem.Format(_T("%.2lf"), data2[i]);
		strRow += strItem + _T(" ");
		if (i == data2.size() - 1)
		{
			strRow += _T("\r\n");
			OutputDebugString(strRow);
		}
	}
}

    效果如下:

图(1) 模板函数合并3个动态数组
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带vector<T>的模板函数 的相关文章

  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • Unity 性能优化四:UI耗时函数、资源加载、卸载API

    UI耗时函数 1 1 Canvas SendWillRenderCanvases 这个函数是由于自身UI的更新 产生的耗时 1 这里更新的是vertex 属性 比如 color tangent position uv 修改recttrans
  • Python自动抢红包,超详细教程,再也不会错过微信红包了!

    转载自公众号Python多一点 原文链接 Python抢红包 大家好又到了每周六的Python小课堂 今天咱们不说别的 说点有意思的事情 教教大家如何用Python自动抢红包 提到抢红包 就不得不提Xposed框架 它简直是个抢红包的神器
  • c++ 字符串替换指定字符

    这个例子把string字符串中的 替换成 原作者Michael Mrozek 在stackoverflow找到的https stackoverflow com questions 3418231 replace part of a stri
  • 嵌入式开发面试常见问题

    文章目录 0 请问预处理器标识 error的目的是什么 1 嵌入式系统中经常要用到无限循环 如何用C编写死循环 2 程序的局部变量存在于哪里 全局变量存在于哪里 动态申请数据存在于哪里 3 关键字const有什么含义 4 什么是预编译 何时
  • mongdb windows本地进行备份与恢复 也可集成到linux

    1 备份 mongodump h ip 端口 d 备份数据库名称 o 备份路径 示例 mongodump h xxx 27017 u root p test authenticationDatabase admin d test o D t
  • centOS中使用如下命令安装jenkins(详细)

    1 安装jdk wget https download oracle com otn java jdk 8u202 b08 1961070e4c9b4e26a04e7f5a083f551e jdk 8u202 linux x64 tar g
  • VS2017中缺少NuGet 程序包,没有NuGet

    今天装软件的时候 发现我VS2017缺少了NuGet程序包 然后找网上搜索 并没有找到解决步骤 后来去了官网才知道VS2017没有对应网址下载了 已经内嵌在VS2017安装命令台里了 官网在这 https www nuget org dow
  • win10系统开启扫描仪服务器,win10通用扫描仪安装步骤

    win10通用扫描仪安装步骤 为了更加方便地扫描图片文档 很多朋友都会在win10系统电脑中安装扫描仪 不过 最近一些朋友反馈自己在安装之后不知道从哪里打开 让扫描仪开始操作扫描 下面就让小编教我去扫描仪怎么安装吧 扫描仪怎么安装 1 进入
  • ZYNQ之FPGA LED 灯闪烁实验

    一 LED 灯简介 LED灯 又名发光二极管 LED灯工作电流很小 有的仅零点几毫安即可发光 抗冲击和抗震性能好 可靠性高 寿命长 由于这些优点 LED灯被广泛用在仪器仪表中作指示灯 液晶屏背光源等诸多领域 不同材料的发光二极管可以发出红
  • Django 错误之 No module named ‘MySQLdb’

    由于卸载Mysql时将很多相关依赖包都卸载了 重装mysql后启动django出现如下错误 django core exceptions ImproperlyConfigured Error loading MySQLdb module N
  • Linux Shell 之 Shell中的函数调用

    说起函数调用 相信大家也不会陌生 然而对于初学Shell的我来说 Shell中函数调用方式却有点让我不太习惯 自己也走了不少的弯路 因为传递参数时出了一个很 自然 的错误 也让我吃了不少的苦头 所以总结一下Shell中函数的调用方法 一 S
  • linux下设置线程亲和性

    linux下线程亲和性主要就是通过pthread setaffinity np 函数来完成 首先将线程需要绑定的core编号 添加到一个集合中 然后调用此函数就ok 测试代码如下 define GUN SOURCE include
  • 仿真4. 仿真平台架构设计

    背景 1 业务背景 我司对仿真系统的需求日渐增加 比如道路交通的仿真 船舶港口仿真 车联网 ad hoc 仿真 以及运营商承载网的仿真等 2 回顾 什么是仿真时钟 用于描述仿真时间的变化 在连续系统中 仿真时间的变化基于仿真时钟步长的确定
  • 激光三角测距

    激光三角测距原理 1 简介 1 1 Halcon基础 1 2 激光三角法测量系统 2 直射式激光三角测距法 3 斜射式激光三角测距法 3 工作原理 3 1 功能 3 2 普通面阵相机 3 3 线激光的选择 3 4 影响精度的因素 3 5 标
  • Android 禁止输入表情符

    添加过滤器 mEtContent setFilters inputFilters 实现过滤器 private InputFilter inputFilters new InputFilter new InputFilter Pattern
  • MySQL之DQL——查询语言

    前言 今天给大家带来关于数据库查询相关操作 希望各位看官能看个愉快 目录 一 基本概念 1 1 基本概念 1 2 SQL语言的分类 1 3 数据库的存储特点 二 MySQL 2 1 MySQL服务的登录和退出 2 2 MySQL服务的启动和
  • 重磅!Cloud Ace 在班加罗尔和孟买成立新的据点

    Cloud Ace Cooperation 总部位于东京千代田区 Makoto Aoki 总裁 很高兴地宣布 我们已经在班加罗尔建立了新的开发中心 并在孟买建立了新的销售办事处 作为 Cloud Ace 进一步扩大公司在印度业务的努力的一部
  • MySQL之DML

    1 添加数据 语法 insert into 表名 列名1 列名2 列名n values 值1 值2 值n 注意 1 列名和值要一一对应 2 如果表名后 不定义列名 则默认给所有列添加值 insert into 表名 values 值1 值2
  • 关于多线程爬取的加强练习

    多线程能够帮助我们提升爬取爬虫爬取的速度 上一篇文章我们也讲到了如何简单的使用多线程来爬取自己想要要去的东西 今天我们来加强以下 今天我们的目标是多线程爬取股票网站的信息 并保存成文件 本次保存文件的格式为txt 各位想保存别的格式也可以哦
  • 带vector<T>的模板函数

    若两个函数的逻辑相同 但参数类型不同 则可以把这2个函数合并为一个模板函数 有利于精简代码和提高可读性 比如 函数A 将CString的三个动态数组 vector