Class Templates
首先举个使用模板的例子
//vector.h
template
class vector {
public:
void push_back(const T& v);{ /*...*/}
size_t size() const;{ /*...*/} //cosnt表示该函数不会修改类的状态
T& operator[](size_t index) const;{ /*...*/} //[]重载运算符
/* ... */
};
//函数实现可以在定义实现,也可以在后面实现
/*
template
void vector::push_back(const T& v){}
template
size_t vector::size() const{}
template
T& vector::operator[](size_t index) const{}
*/
- 类模板不是类,只有填上参数才是一个类,填入两个不同参数的类模板是两个不同的类
- 使用类模板会显著增加编译时间
- 类模板的定义和实现无法分开编译,也就是说,无法通过将定义写在
.h中以及将实现写在.cpp中进行单独编译,因此要在头文件就写好实现(g++编译器编译标准库模板便是如此) template <typename T> or template <class T>中class和typename作用相同,typename只是增强了可读性typename N = std::allocator<T>可定义默认参数,若未给定具体参数则为T类型vector是一个模板,而vector<T>则是一个类型名,因此vector::size()是非法的
Sequence Containers
序列容器类似python中的list,即一堆元素的线性集合,c++中常用std::vector<T>和std::deque<T>
std::vectorstd::vector<T> v创建空向量vstd::vector<T> v(n)创建大小为n的向量vstd::vector<T> v(n,e)同上,元素值为ev.push_back(e)向量v末尾增加(或者说如字面意思,压入)一个元素ev.pop_back()将向量v末尾元素删除(弹出),无返回值v.empty()判断向量v是否为空T e = v[i] or v[i] = e赋值操作,无越界检查T e = v.at(i) or v.at(i) = e同上,越界报错v.clear()清空向量v
std::deque<T>- 同
std::vector d.push_front(e)向量d开头增加(压入)一个元素ed.pop_front()将向量d开头元素删除(弹出),无返回值
- 同

Comments NOTHING