21天学通C++--阅读笔记6(模板、标准模板库)

来源:互联网 发布:excel筛选文本数据 编辑:程序博客网 时间:2024/05/17 09:10

模板类

通过将类型作为参数来创建新的实例。

eg.

template<class T>//class表示模板的参数是类型,T表示参数化类型

class ClassA{

void methodA(T t);//定义

};

 

template<class T>

voidClassA<T>::methodA(T t){};

 

ClassA<int>intObj;

intObj.methodA(2);

 

模板类友元

1. 非模板友元类或函数

2.通用模板友元类或函数

3.特定类型模板友元类或函数

eg.

template<class T>

class ClassA{

friend void methodF1(ClassA<int> t);//非模板友元函数

friend void methodF2(ClassA<T> t);//通用模板友元函数

};

 

//该函数为非模板友元函数

voidmethodF1(ClassA<int> t);

 

ClassA<int>intClassA;

methodF1(intClassA);

 

//该函数为通用模板友元函数

template<class T>

voidmethodF2(ClassA<T> t);

 

ClassA<int>intClassA;

methodF2(intClassA);

 

模板类静态成员

eg.

template<class T>

class ClassA{

void methodA(T t);

static int GetStaticParam(){return staticParam};

static int staticParam;

};

 

//通过完整的模板认证完成静态成员变量的初始化

template<class T>

intClassA<T>::staticParam = 0;

 

注:每一个类型有一个staticParam,例如ClassA<int>类型的所有对象共享一个staticParamClassA<double>类型的所有对象共享另一个staticParam

 

模板函数

eg.

template<class T>

void methodA(Tt){};

 

int iData = 0;

methodA(iData);

 

标准模板库(STL

基于模板的容器类库,包括链表、列表、队列、堆栈、常用排序查找算法。

 

vector向量容器:可自增长,主要用于顺序读写

eg.

vector<int>vInt(50);//分配50个元素的内存空间给vectorvInt.size() = 50

vInt.empty();//判断向量是否为空

vInt.erase(vInt.begin()+ 10);//删除第10个元素

vInt.push_back(10);//最末尾增加一个元素

 

list对元素的频繁插入或删除进行了优化,双向链表

list<int>lInt;

lInt.push_back(10);//最末尾增加一个元素

for(list<int>::const_iteratorit = lInt.begin(); it != lInt.end(); it++){

cout<<*it<<" ";

}

 

deque继承了vector的顺序读写效率,优化了前端后端操作。主要用于在一端或两端进行插入、删除

 

stack堆栈,可以在尾端增长和收缩的连续分配区域,后入先出

 

map映射容器,

class ClassA{

string getName();

}

ClassA obj1;

map<string,ClassA> map_classA;

map_classA[obj1.getName()]= obj1;

ClassAobj2 = map_classA["name"];//检索key="name"的记录

//遍历

for(map<string,ClassA>::const_iterator it = map_classA.begin(); ..; ..){

//first是键key,类型是stringsecond是值,类型ClassA

cout<<it->first<<":"<<it->second->getName()<<endl;

}

 

算法类:<algorithm>

函数对象:定义重载运算符()的一个类的实例

template<classT>

class Print{

public: void operator()(const T & t){

cout<<t;

}

}

 

Print<int>printObj;

printObj(10);//类对象作为函数调用

 

不变序列算法:不改变序列中的元素,如for_each()find()search()count()

vector<int>vInt(5);

for_each(vInt.begin(),vInt.end(), printObj);//vInt中的每一个元素调用printObj

 

改变序列算法:改变序列中的算法,填充或重新安排集合,如fill()

fill(vInt.begin(),vInt.begin() + 2, 1);

fill(vInt.begin()+ 2, vInt.end(), 2);

结果:vInt = 1 1 2 2 2

 

 

 

 

 

0 0
原创粉丝点击