一.模版
概念
模板可以让类或者函数支持一种通用类型,这种通用数据类型在实际运行的过程中可以使用任何数据类型。因此程序员可以写出一些与类型无关的代码,这种编程方式也被称为泛型编程。
1.函数模版
使函数可以支持通用数据类型
关键词:template<typename 替代符>
template<typename T> // typename 也可以是class
T add(T a,T b)
{
return a+b;
}
2.类模版
使一个类支持模板编程,可以使一个类支持通用数据类型。
// 类模板
template<class T>
class Test
{
private:
T val;
public:
Test(T v):val(v){}
T get_val()
{
return val;
}
void set_val(const T &val)
{
this->val = val;
}
};
二.容器
概念
容器是用来存储数据的集合,数据的元素可以是任何类型(因为是使用模板实现)。
容器类的使用,都需要引入对应的头文件。
标准模版库(STL)
标准模板库(Standard Template Library,STL)是惠普实验室开发的一系列软件的统称。虽说它主要出现到了C++中,但是在被引入C++之前该技术就已经存在了很长时间。
STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
1.顺序容器
顺序容器中每个元素均有固定的位置并程线行排布。除非使用删除或者插入的操作改变元素的位置。否则元素位置不变。
array数组
array数组是C++11新增的容器类型,优点是与传统数组相比更加安全、更加易于使用。array数组是定长的,没办法方便进行伸缩。
vector 向量
vector内部是由数组实现的,比较适合进行随机存取操作,而不擅长插入和删除操作。
list列表
list内部是由双向循环链表实现,内存空间不连续,不支持下标访问。优点:可以高效的删除和插入操作。但是不适合随机存取操作。
deque队列
队列几乎支持所有vector的API,性能位于vector与list两者之间。是最擅长两端存取的顺序容器。
string字符串
是一种特殊的容器
2.关联容器
关联容器的各个元素之间没有严格顺序,虽然内部具有排序的特点,但是在使用时没有任何顺序相关的接口。
map键值对
对于map而言,键具有唯一性,键通常使用字符串类型,值可能是任何类型。通过键可以找到对应的值。
迭代器遍历
迭代器是一个特殊的指针,主要用于容器元素的读写以及遍历。
如果迭代器不进行修改,建议使用只读迭代器:const_iterator,反之则使用iterator。