STL(标准模板库)
文章目录
- 模板
- STL
模板
模板是泛型编程的基础,泛型编程以一种独立于任何特定类型的方式编写代码。
模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。
每个容器都有一个单一的定义,比如 向量,我们可以定义许多不同类型的向量,比如 vector 或 vector 。
函数模板的一般形式:
template <typename type> ret-type func-name(parameter list)
{
// 函数的主体
}
函数模板实例,返回两个数中的最大值:
#include <iostream>
#include <string>
using namespace std;
template <typename T>
inline T const& Max (T const& a, T const& b)
{
return a < b ? b:a;
}
int main ()
{
int i = 39;
int j = 20;
cout << "Max(i, j): " << Max(i, j) << endl;
double f1 = 13.5;
double f2 = 20.7;
cout << "Max(f1, f2): " << Max(f1, f2) << endl;
string s1 = "Hello";
string s2 = "World";
cout << "Max(s1, s2): " << Max(s1, s2) << endl;
return 0;
}
运行结果:
和函数模板一样,也可以定义类模板,一般形式如下:
template <class type> class class-name {
.
.
.
}
type 是占位符类型名称,可以在类被实例化的时候进行指定。
类模板的例子:
#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
#include <stdexcept>
using namespace std;
template <class T>
class Stack {
private:
vector<T> elems; // 元素
public:
void push(T const&); // 入栈
void pop(); // 出栈
T top() const; // 返回栈顶元素
bool empty() const { // 如果为空则返回真。
return elems.empty();
}
};
template <class T>
void Stack<T>::push(T const& elem)
{
// 追加传入元素的副本
elems.push_back(elem);
}
template <class T>
void Stack<T>::pop()
{
if (elems.empty()) {
throw out_of_range("Stack<>::pop(): empty stack");
}
// 删除最后一个元素
elems.pop_back();
}
template <class T>
T Stack<T>::top() const
{
if (elems.empty()) {
throw out_of_range("Stack<>::top(): empty stack");
}
// 返回最后一个元素的副本
return elems.back();
}
int main()
{
try {
Stack<int> intStack; // int 类型的栈
Stack<string> stringStack; // string 类型的栈
// 操作 int 类型的栈
intStack.push(7);
cout << intStack.top() << endl;
// 操作 string 类型的栈
stringStack.push("hello");
cout << stringStack.top() << std::endl;
stringStack.pop();
stringStack.pop();
}
catch (exception const& ex) {
cerr << "Exception: " << ex.what() << endl;
return -1;
}
}
运行结果:
STL
C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。
STL主要包含三个组件:
- 容器(Containers):管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。
- 算法(Algorithms):算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。
- 迭代器(iterators):用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。
vector的实例(vector与array十分相似,唯一不同的是,向量在需要扩展大小的时候,会自动处理它自己的存储需求):
#include <iostream>
#include <vector>
#include <array>
using namespace std;
int main()
{
std::vector<int> demo{ 1,2 };
demo.push_back(1); //push_back操作
std::vector<int>test{ 3,4,5 };
demo.insert(demo.end(), test.begin(), test.end());//inset操作
// 循环打印值
for (int i = 0; i < demo.size(); i++) {
cout << demo[i] << " ";
}
// 使用迭代器 iterator 访问值
vector<int>::iterator v = demo.begin();
while (v != demo.end()) {
cout << "value of v = " << *v << endl;
v++;
}
return 0;
}
运行结果:
STL 中的大部分常用算法都在头文件 algorithm 中定义。此外,头文件 numeric 中也有一些算法。
find的用法:
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int a[10] = { 10,20,30,40 };
vector<int> v;
v.push_back(1); v.push_back(2);
v.push_back(3); v.push_back(4); //此后v里放着4个元素:1,2,3,4
// 定义迭代器,用find查找
vector<int>::iterator p;
p = find(v.begin(), v.end(), 3); //在v中查找3
if (p != v.end()) //若找不到,find返回 v.end()
cout << "1. " << *p << endl; //找到了
p = find(v.begin(), v.end(), 9);
if (p == v.end())
cout << "not found " << endl; //没找到
p = find(v.begin() + 1, v.end() - 1, 4); //在,3 这两个元素中查找4
cout << "2. " << *p << endl;
int * pp = find(a, a + 4, 20);
if (pp == a + 4)
cout << "not found" << endl;
else
cout << "3. " << *pp << endl;
return 0;
}
运行结果:
以上。