c++编程之模板和泛型编程
1. 简介
我们对传递数值或变量给函数都很熟悉,除了传递变量,我们还能传递类型给模板。传递类型就是大家所熟知的泛型编程,因为 我们可以用泛型编写程序,而用特定的类型调用。
泛型编程的目的是为了编写的程序不依赖于数据类型。在 C 语言中,所有的代码都需要绑定到确定的数据类型,这样写的代码只能对特定的数据类型起作用。 而模板可以让我们实现泛型编程。你可以将类型作为参数来构建模板函数和类模板。当你的算法需要作用于多种数据类型的时候,模板就显得及其有用了。
C++的标准模板库(STL)提供了一些常用的容器类模板的实现,例如vector,可以用来存放所有类型的元素。
2. 示例:STL 中的 vector 类模板
C/C++中的内置数组有一些缺点:
- 它的大小是固定的,需要在声明的时候确定大小,不支持动态声明。你不能在执行期给数组扩容;
- 数组不提供下标边界校验,你可以使用超出边界的下标
- 你需要自己实现数组比较,和赋值操作
C++提供了一个vector类模板,作为标准模板库(STL)的一部分。vector被定义在<vector>头文件中,属于std命名空间。vector 是最常用的 STL 类,它能够取代数组,并且支持动态分配空间和一些其它操作(例如比较和赋值)。
vector 是一个类模板,它可以被特定类型的实例化,形如:vector<int>, vector<double>, vector<string>。同一个模板能够用于多种类型,而不必为每种类型都写一套实现。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
void print(const vector<int> &v);
int main(int argc, char *argv[]) {
vector<int> v1(5); // Create a vector with 5 elements.
// Assign values into v1, using array-like index []
// You can retrieve the size of vector via size()
for (int i = 0; i < v1.size(); i++) {
v1[i] = (i + 1) * 2;
}
// Print vector content, using at()
for (int i = 0; i < v1.size(); i++) {
cout << v1.at(i) << " ";
}
cout << endl;
vector<int> v2;
// Assign v1 to v2 memberwise
v2 = v1;
for (int i = 0; i < v2.size(); i++) {
cout << v2[i] << " ";
}
cout << endl;
// Compare 2 vectors memberwise
cout << boolalpha << (v1 == v2) << endl;
// Append more elements - synamically allocate memory
v1.push_back(80);
v1.push_back(81);
for (int i = 0; i < v1.size(); i++) {
cout << v1[i] << " ";
}
cout << endl;
vector<string> v3;
v3.push_back("a for apple");
v3.push_back("b for boy");
for (int i = 0; i < v3.size(); i++) {
cout << v3[i] << " ";
}
cout << endl;
return 0;
}说明:




