1.排序函数模板

已知主函数如程序后缀代码所示,请为其编写适当的模板函数,使主函数的bubbleSort函数可以对一个整型数组和一个浮点数数组进行输入、排序、输出操作。

#include <iostream>
#include <iomanip>

using namespace std;

template <typename T>
void bubbleSort(T *arr, int size){
	for(int i = 0; i < (size - 1); i++) {
		for(int j = 0; j < (size - 1 - i); j++) {
			if (arr[j] > arr[j+1]) {
				T temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = temp;
			}
		}
	}
}

int main() {
	const int arraySize = 10;  // size of array
	int a[arraySize] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}, i;

	// display int array in original order
	cout << "Integer data items in original order\n";

	for (i = 0; i < arraySize; ++i)
		cout << setw(6) << a[i];

	bubbleSort(a, arraySize);          // sort the array

	// display int array in sorted order
	cout << "\nInteger data items in ascending order\n";

	for (i = 0; i < arraySize; ++i)
		cout << setw(6) << a[i];

	cout << "\n\n";

	// initialize double array
	double b[arraySize] = {10.1, 9.9, 8.8, 7.7, 6.6, 5.5, 4.4, 3.3, 2.2, 1.1};

	// display double array in original order
	cout << "double point data items in original order\n";

	for (i = 0; i < arraySize; ++i)
		cout << setw(6) << b[i];

	bubbleSort(b, arraySize);          // sort the array

	// display sorted double array
	cout << "\ndouble point data items in ascending order\n";

	for ( i = 0; i < arraySize; ++i )
		cout << setw(6) << b[i];

	cout << endl;

	return 0;

} // end main

运行结果:

C++编程练习||1.排序函数模板2.函数模板3.重载printArray函数模板_#include


2.函数模板

 

   思考:如果重载的函数,其解决问题的逻辑是一致的、函数体语句相同,只是处理的数据类型不同,那么写多个相同的函数体,是重复劳动,而且还可能因为代码的冗余造成不一致性。

   解决:使用模板

   例:求绝对值函数的模板

#include <iostream>

using namespace std;

template <typename T>
T abs(T x) {
	return x >= 0 ? x : -x;
}

int main() {
	
	int n =- 5;
	double d = -5.5;
	cout << abs(n) << endl;
	cout << abs(d) << endl;

	return 0;
}

运行结果:

C++编程练习||1.排序函数模板2.函数模板3.重载printArray函数模板_#include_02

3.重载printArray函数模板

重载printArray函数模板,代码如下:


   重载上述函数模板,使它包含两个额外的名为 int lowSubscript (范围下限)和 int highSubscript(范围上限)的整型参数。调用这个函数会打印出数组中指定范围的元素。函数将判定lowSubscript和highSubscript是否有效,如果超出数组下标范围或highSubscript比lowSubscript小,重载的printArray函数将返回0,否则,返回打印出的元素的个数。然后修改main函数,通过三个数组a、b、c来对两个版本的printArray进行测试。

   注:程序后缀代码已给出。

   提示:字符'\0'是不可打印字符,因此,cout<<'\0'; 将导致输出不确定数值。

#include <iostream>

using namespace std;

template<typename T>

void printArray(const T *arrayset, int count) {
	for (int i = 0; i < count && arrayset[i]!='\0'; i++)
		cout << arrayset[i] << " ";
	cout << endl;

}
template<typename T>
int printArray(const T *arrayset, int count, int lowSubscript, int highSubscript) {
	if (lowSubscript < 0 || highSubscript >= count || highSubscript < lowSubscript) {
		return 0;
	} else {
		int count = 0;
		for (int i = lowSubscript; i <= highSubscript && arrayset[i]!='\0'; i++) {
			cout << arrayset[i] << " ";
			count++; 
		}
			
		cout << endl;
		return count;
	}
}

int main() {
	// sizes of arrays
	const int aCount = 5;
	const int bCount = 7;
	const int cCount = 6;

	// declare and initialize arrays
	int a[aCount] = {1, 2, 3, 4, 5};
	double b[bCount] = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7};
	char c[cCount] = "HELLO";  // 6th position for null
	int elements;

	// display array a using original printArray function
	cout << "\nUsing original printArray function\n";
	printArray(a, aCount);

	// display array a using new printArray function
	cout << "\nArray a contains:\n";
	elements = printArray(a, aCount, 0, aCount - 1);
	cout << elements << " elements were output\n";

	// display elements 1-3 of array a
	cout << "Array a from 1 to 3 is:\n";
	elements = printArray(a, aCount, 1, 3);
	cout << elements << " elements were output\n";

	// try to print an invalid element
	cout << "Array a output with invalid subscripts:\n";
	elements = printArray(a, aCount, -1, 10);
	cout << elements << " elements were output\n\n";

	// display array b using original printArray function
	cout << "\nUsing original printArray function\n";
	printArray(a, aCount);

	// display array b using new printArray function
	cout << "Array b contains:\n";
	elements = printArray(b, bCount, 0, bCount - 1);
	cout << elements << " elements were output\n";

	// display elements 1-3 of array b
	cout << "Array b from 1 to 3 is:\n";
	elements = printArray(b, bCount, 1, 3);
	cout << elements << " elements were output\n";

	// try to print an invalid element
	cout << "Array b output with invalid subscripts:\n";
	elements = printArray(b, bCount, -1, 10);
	cout << elements << " elements were output\n\n";

	// display array c using original printArray function
	cout << "\nUsing original printArray function\n";
	printArray(a, aCount);

	// display array c using new printArray function
	cout << "Array c contains:\n";
	elements = printArray(c, cCount, 0, cCount - 1);
	cout << elements << " elements were output\n";

	// display elements 1-3 of array c
	cout << "Array c from 1 to 3 is:\n";
	elements = printArray(c, cCount, 1, 3);
	cout << elements << " elements were output\n";

	// try to display an invalid element
	cout << "Array c output with invalid subscripts:\n";
	elements = printArray(c, cCount, -1, 10);
	cout << elements << " elements were output" << endl;

	return 0;

} // end main

C++编程练习||1.排序函数模板2.函数模板3.重载printArray函数模板_排序函数_03