C++模板与标准模板库(STL)入门
立即解锁
发布时间: 2025-08-21 00:25:59 阅读量: 1 订阅数: 4 


C++ for Financial Engineers: An Object-Oriented Approach
### C++模板与标准模板库(STL)入门
#### 1. C++模板类实例化
模板类的强大之处在于其可重用性。例如,我们可以将模板类实例化为处理整数的类,代码如下:
```cpp
Range<int> range1 (0, 10);
int valL = -1;
int valM = 5;
int valR = 20;
if (range1.left(valL) == true)
cout << valL << " to left, OK\n";
if (range1.contains(valM) == true)
cout << valM << " in interval, OK\n";
if (range1.right(valR) == true)
cout << valR << " to right, OK\n";
```
这里,我们无需编写额外代码,只需再次实例化模板类即可。不过要注意,模板类假定底层数据类型实现了一些函数和运算符(如 `<`、`>`、`<=`)。
在声明 `Range` 类时,使用了如下语法:
```cpp
template <class Type = double> class Range
```
这意味着在不指定参数实例化模板类时,底层类型将是 `double`,这样能避免每次都输入数据类型。我们还可以使用 `typedef` 定义同义词,示例如下:
```cpp
typedef Range<> DoubleRange;
DoubleRange d1(-1.0, 1.0);
print (d1);
```
处理日期时,可按以下方式操作:
```cpp
typedef Range<DatasimDate> DateRange;
DatasimDate today;
DatasimDate anotherDate = today + 365;
DateRange whatsAnotherYear(today, anotherDate);
print(whatsAnotherYear);
```
建议将所有同义词定义在一处,方便后续查找。
#### 2. 范围模板类的可重用性
范围模板类具有广泛的应用场景,例如:
- 二项式、三项式和有限差分方法。
- 区间算术以及线性和非线性方程的求解,区间算术基于对某个(未知)量进行双侧估计。
- 作为更大数据结构的构建块。
若对模板类的功能不满意,可通过以下三种机制扩展其功能:
- 继承
- 组合与委托
- 定义接受模板类实例的非成员函数
#### 3. 模板函数
除了模板类,还可以创建非成员(或 C 风格)的模板函数。以交换两个相同类实例的函数为例,代码如下:
```cpp
template <class V> void mySwap(V& v1, V& v2)
{
V tmp = v2;
v2 = v1;
v1 = tmp;
}
```
使用示例:
```cpp
int j = 10;
int k = 20;
mySwap(j, k);
Range<int> range1 (0, 10);
Range<int> range2 (20, 30);
mySwap (range1, range2);
```
可以编写多种相关的模板函数,并将它们分组到一个命名空间中。
#### 4. 模板类示例:二维点类
下面是一个完整的模板类示例,用于表示二维点,其坐标可以是不同的数据类型。
**Point.hpp 文件**:
```cpp
// Point.hpp
//
// Generic point class. The first coordinate is of one
// type and the second coordinate is of the second type.
//
// (C) Datasim Education BV 2006
#ifndef Point_hpp
#define Point_hpp
#include <iostream>
using namespace std;
template <class TFirst, class TSecond>
class Point
{
private:
// The two coordinates
TFirst m_first;
TSecond m_second;
public:
// Constructors & destructor
Point();
// Default constructor
Point(TFirst first, TSecond second);
Point(const Point<TFirst, TSecond>& source);
virtual ~Point();
// Destructor
// Selectors
TFirst First() const;
// Get first coordinates
TSecond Second() const;
// Get second coordinate
// Modifiers
void First(const TFirst& val);
// Set first coordinate
void Second(const TSecond& val);
// Set second coordinate
// Functions
double Distance(const Point<TFirst, TSecond>& p) const;
// Assignment operator
Point<TFirst, TSecond>& operator =
(const Point<TFirst, TSecond>& source);
// Print
template <class TFirst, class TSecond>
friend ostream& operator << (ostream& os,
const Point<TFirst, TSecond>& p);
};
#endif
```
**Point.cpp 文件**:
```cpp
// Point.cpp
//
// Generic point class.
//
// Last modifi
```
0
0
复制全文
相关推荐






