代码实例:
#include <algorithm> // 引入算法库以使用 sort 函数
#include <iterator> // 引入迭代器库以使用 iterator 类
#include <vector> // 引入 vector 容器
#include <iostream> // 引入输入输出流库
using namespace std; // 使用标准命名空间以简化代码编写
// 模板函数 mySort:对指定范围的元素进行排序并将结果输出到指定的输出范围
template<class T, class InputIterator, class OutputIterator>
void mySort(InputIterator first, InputIterator last, OutputIterator result)
{
vector<T> s; // 创建一个 vector<T> 类型的容器来存储从输入迭代器读取的数据
for (; first != last; ++first) // 遍历输入范围,将数据存储到 vector 中
{
s.push_back(*first); // 将当前元素添加到 vector 中
}
sort(s.begin(), s.end()); // 对 vector 中的元素进行排序
copy(s.begin(), s.end(), result); // 将排序后的结果复制到输出迭代器指定的位置
}
int main()
{
// 测试代码:对 double 类型的数组进行排序
double a[5] = {1.2, 2.4, 0.8, 3.3, 3.2}; // 定义一个 double 类型的数组
mySort<double>(a, a + 5, ostream_iterator<double>(cout, " ")); // 调用 mySort 对数组进行排序,并将结果输出到标准输出流
cout << endl; // 输出换行符
// 测试代码:从标准输入中读取整数,进行排序,并输出结果
mySort<int>(istream_iterator<int>(cin), istream_iterator<int>(), ostream_iterator<int>(cout, " ")); // 调用 mySort 对输入的整数进行排序,并将结果输出到标准输出流
cout << endl; // 输出换行符
return 0; // 程序正常结束
}
代码分析
(1)、
-
头文件引入:
#include <algorithm>
: 提供了排序算法sort
。#include <iterator>
: 提供了iterator
类以及输入/输出迭代器。#include <vector>
: 提供了vector
容器类。#include <iostream>
: 提供了输入输出流。
-
mySort
模板函数:- 模板参数:
T
:数据类型。InputIterator
:输入迭代器类型。OutputIterator
:输出迭代器类型。
- 功能:
- 从输入迭代器
first
到last
范围内读取数据,将其存储到vector
中,进行排序,然后将排序后的数据复制到输出迭代器result
指定的位置。
- 从输入迭代器
- 实现细节:
- 使用
vector<T>
存储数据,以便可以使用sort
进行排序。 copy
函数将排序后的数据写入到输出流中。
- 使用
- 模板参数:
-
main
函数:- 第一个示例:
- 对一个
double
类型的数组a
进行排序,使用ostream_iterator<double>
将结果输出到标准输出流。
- 对一个
- 第二个示例:
- 从标准输入中读取整数(使用
istream_iterator<int>
),排序后通过ostream_iterator<int>
输出结果。注意,用户需要输入数据,并以回车结束输入以完成排序和输出。
- 从标准输入中读取整数(使用
- 第一个示例:
-
输出:
- 第一个示例将输出排序后的
double
数组值,例如0.8 1.2 2.4 3.2 3.3
。 - 第二个示例将根据用户输入的整数进行排序并输出。
- 第一个示例将输出排序后的
注意:在实际运行时,第二个示例需要在输入完数据后按回车键,以便 istream_iterator
完成数据读取。
(2)、在使用 mySort
函数对输入的整数进行排序时,需要按照以下步骤在键盘上操作以输入数据并查看排序结果:
-
运行程序: 首先编译并运行程序。这将启动程序并等待你的输入。
-
输入数据:
- 当程序运行到
mySort<int>(istream_iterator<int>(cin), istream_iterator<int>(), ostream_iterator<int>(cout, " "));
这一行时,程序会等待你从键盘输入整数。 - 输入整数并按下
Enter
键。例如,如果你输入4 1 3 2
,每个整数后面用空格分隔,然后按下Enter
键,程序将把这些输入的整数传递给mySort
函数。
- 当程序运行到
-
结束输入:
- 在输入完所有整数后,你需要告诉程序输入已经完成。在大多数控制台中,你可以通过输入
Ctrl+D
(在 UNIX/Linux 系统中)或Ctrl+Z
(在 Windows 系统中)来表示输入结束。 - 输入
Ctrl+D
或Ctrl+Z
后,程序将会结束输入阶段,并开始处理数据。
- 在输入完所有整数后,你需要告诉程序输入已经完成。在大多数控制台中,你可以通过输入
-
查看排序结果(再按enter键):
- 程序会对你输入的整数进行排序,并将结果输出到屏幕上。
- 如果你的输入是
4 1 3 2
,程序将输出排序后的结果,例如1 2 3 4
,并在最后输出一个换行符。
class解释:
template<class T, class InputIterator, class OutputIterator>
在 C++ 模板中,class
和 typename
关键字是等效的,可以用来定义模板参数。它们都用于声明一个模板的参数类型。
例如,template<class T, class InputIterator, class OutputIterator>
中的 class
关键字用于声明模板参数:
class T
: 代表一个类型参数T
,可以在模板中使用不同的数据类型。class InputIterator
和class OutputIterator
: 分别代表输入和输出迭代器类型参数,允许模板函数或类接受不同的迭代器类型。
实际上,也可以用 typename
替代 class
,效果是一样的:
template<typename T, typename InputIterator, typename OutputIterator>
void myFunction(InputIterator first, InputIterator last, OutputIterator result);