用c++分别按下面两种要求编制一个程序,用同一个函数名对n个数据进行从小到大排序,数据类型可以是整型、单精度型、双精度型。 ①用重载函数实现;②用函数模板实现。 比较这两种方法各有什么特点,什么情况下可以用函数模板代替重载函数?什么情况下不可以用函数模板代替重载函数?
时间: 2024-12-24 16:41:09 浏览: 18
### 用重载函数实现
首先,我们通过重载函数来实现对不同类型的数据进行排序。创建一个名为`sortArray`的函数,针对`int`, `float`和`double`三种类型分别定义:
```cpp
#include <vector>
#include <algorithm>
// 对整型数组排序
template<typename T>
void sortArray(std::vector<T>& arr) {
std::sort(arr.begin(), arr.end());
}
// 对浮点型数组排序
template<>
void sortArray<std::vector<float>>(std::vector<float>& arr) {
std::sort(arr.begin(), arr.end(), std::less<float>());
}
// 对双精度型数组排序
template<>
void sortArray<std::vector<double>>(std::vector<double>& arr) {
std::sort(arr.begin(), arr.end(), std::less<double>());
}
int main() {
std::vector<int> intArr = {4, 2, 9, 1};
std::vector<float> floatArr = {3.1, 1.0, 2.7, 4.5};
std::vector<double> doubleArr = {3.14, 1.618, 2.718, 1.414};
sortArray(intArr);
sortArray(floatArr);
sortArray(doubleArr);
// 输出排序后的结果...
}
```
### 用函数模板实现
然后,我们可以使用C++的函数模板来实现通用的排序功能,无论输入的是哪种类型:
```cpp
#include <vector>
#include <algorithm>
template<typename T>
void sortArray(std::vector<T>& arr) {
std::sort(arr.begin(), arr.end());
}
int main() {
std::vector<int> intArr = {4, 2, 9, 1};
std::vector<float> floatArr = {3.1, 1.0, 2.7, 4.5};
std::vector<double> doubleArr = {3.14, 1.618, 2.718, 1.414};
sortArray(intArr);
sortArray(floatArr);
sortArray(doubleArr);
// 输出排序后的结果...
}
```
**特点对比**:
- **重载函数**:优点是代码更清晰,每个数据类型的排序都有专门的函数,易于理解和维护;缺点是如果增加新数据类型,需要添加新的函数。
- **函数模板**:优点是代码简洁,只需一个函数就可以处理多种数据类型,更具有泛化能力;缺点是模板推断可能会导致二义性,特别是在编译期间难以确定具体的实现。
**何时使用函数模板**:
- 当需要对多种数据类型共享相同的算法逻辑时,函数模板可以提高代码复用性。
- 当数据类型未知或动态指定时,函数模板能提供更好的灵活性。
**何时不使用函数模板**:
- 如果数据类型明确,并且每个类型需要定制化的排序逻辑(如特定范围内的排序),则应选择重载函数。
- 如果模板推断可能导致二义性或效率下降,可能需要显式指定模板参数。
阅读全文