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
运行结果:
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;
}
运行结果:
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