课件内容:
part1 C++模板介绍
part2 泛型编程
part3 容器
part4 一些进阶问题
C++主要有两种类型的模板
1.类模板(Class template):使用泛型参数的类
2.函数模板(Function template):使用泛型参数的函数
模板实例化:显示和隐式两种方式
类模板实参可以是某一型别或常量(仅限int或enum)
C++类模板的声明注意事项:
1.声明类模板和声明函数模板类似
2.关键字class和typename都可以用,但还是倾向于使用typename
templateclass Stack{......};
template class Stack{......};
3.在类模板内部,T可以像其他型别一样(比如int,char等)定义成员变量和成员函数
void Push(const T const& element);
int Pop(T& element);
int Top(T& element) const;
std::vector m_Members;
泛型编程(Generic programming)
1.概观(OverView):泛型编程作为一种编程思维和想法,它是一种编程方法,不依赖于具体的语言。
2.关联特性(Traits)
3.迭代器(Iterators):迭代器是指针的泛化(generalization of pointers)
3.1迭代器本身是一个对象,指向另外一个(可以被迭代的)对象。
3.2用来迭代一组对象,即如果迭代器指向一组对象中的某个元素,则通过increment以后它就可以指向下一组对象中的一个元素。
迭代器(1)
迭代器是指针的泛化(generalization of pointers)
迭代器本身是一个对象,指向另外一个(可以被迭代的)对象
用来迭代一组对象,即如果迭代器指向一组对象中的某个元素,则通过increment以后它就可以指向这组对象的下一个元素
在STL中迭代器是容器与算法之间的接口
算法通常以迭代器作为输入参数
容器只要提供一种方式,可以让迭代器访问容器中的元素即可。
迭代器(2)
迭代器的基本思想
1)在STL中,迭代器最重要的思想就是分离算法和容器,使之不需要相互依赖
2)迭代器将算法和容器粘合(stick)在一起从而使得一种算法的实现可以运用到多种不同的容器上,如下面的例子所示,find算法接收一对迭代器,分别指向容器的开始和终止位置:
templalte
inline _InIt find(_InIt _First,_InIt _Last,const _Ty& _Val){
//find frist matching _Val
for(;_First != _Last;++_First)
if(*_First == _Val)
break;
return (_First);
}
Vector
1.Vector是一个能够存放任意型别的动态数组
2.Vector的数据结构和操作于数组类似,在内存中的表示是一段地址连续的空间。
3.Vector与数组的区别在于,数组大小往往是定义的时候已经指定,而Vector支持动态空间大小调整,随着元素的增加,Vector内部会自动扩充内存空间。
4.为了使用Vector,必须用include指令包含如下文件,并通过std命名空间去访问:
#include
int main(){
std::vector v;
}
创建Vector
向Vector中添加元素
判断Vector是否为空
访问Vector里面的元素:
vector::at() //会进行边界检查,判断是否越界
vector::operator[] //不进行边界检查,性能较好
删除元素:
Deque是一个能够存放任意型别的双向队列
Deque提供的函数于Vector类似,新增了两个函数:
push_front:在头部插入一个元素
pop_front:在头部弹出一个元素
Deque采用了于Vector不同内存管理方法:大块分配内存
为了使用deque,必须用include指令包含如下文件,并通过std命名空间去访问:
include
int main(){
std::deque dq;
}
List的优势和劣势
常用的操作方法: