带vector<T>的模板函数

Posted sanqima

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带vector<T>的模板函数相关的知识,希望对你有一定的参考价值。

    若两个函数的逻辑相同,但参数类型不同,则可以把这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个动态数组

以上是关于带vector<T>的模板函数的主要内容,如果未能解决你的问题,请参考以下文章

带vector<T>的模板函数

T::iterator 出错,其中模板参数 T 可能是 vector<int> 或 list<int>

使用模板类创建我自己的 vector.size 和 vector.capacity 函数?

使用带有 lambda 函数指针的模板

序列式容器------vector类模板

是否可以重载模板函数以与std :: vector的元素一起使用?