课时35类模板
类模板
创建类模板的实例
class Nameobject;
类模板与模板类的区别
类模板是模板的定义,不是一个实实在在的类,定义中用到通用类型参数
模板类是实实在在的类定义。是类模板的实例化。类定义中参数被实际类型所代替
课时37STL基本概念
STL
向量(vector)属于序列式容器,用于容纳不定长线行序列,提供对序列的快速随机访问(也称直接访问)
向量是动态结构,模拟动态数组,它的大小不固定,可以在程序运行时增加或减少
vector的元素可以是任意类型T,但必须具有赋值和拷贝能力,具有public的拷贝构造函数和重载的赋值运算符
课时38vector
STL
vector的大小(size)和容量(capacity)通常是不同的,capacity返回vector实际能容纳的元素数量。如果超过这个数量需要重新配置内部存储器
课时40排序算法
STL
STL中的排序算法
sort(num.begin(), num.end());是算法(algorithm)库中的排序算法
sort模板有两种
第一种模板,sort重排[first, last]之间的元素,产生一个按operate
第二种模板和前一个的行为相似,不过它用sort代替了operate
template
void sort(Ranlt first, Ranlt last);
template
void sort(Ranlt first, Ranlt last, Pred pr);
示例:使用sort进行排序
#include
#include
#include
#include
class ID
{
public:
ID() :name(""), score(0)
{
}
ID(std::string n, int s) :name(n), score(s)
{
}
std::string name;
int score;
};
bool operator==(const ID& x, const ID& y)//从小到大需要用到
{
return (x.name == y.name) && (x.score == y.score);
}
bool operator
{
return x.score < y.score;
}
bool compare(const ID& x, const ID& y)//从大到小需要用到
{
return x.score > y.score;
}
int main()
{
std::vector ids;
std::vector::iterator iter;
ids.push_back(ID("Tome", 5));
ids.push_back(ID("John", 1));
ids.push_back(ID("Alex", 2));
for (iter = ids.begin(); iter != ids.end(); ++iter)
{
std::cout << (*iter).name << " " << (*iter).score << std::endl;
}
std::cout << "after sort" << std::endl;
sort(ids.begin(), ids.end());//从小到大
sort(ids.begin(), ids.end(), compare);//从大到小,需要用到compare()函数
for (iter = ids.begin(); iter != ids.end(); ++iter)
{
std::cout << (*iter).name << " " << (*iter).score << std::endl;
}
system("pause");
return 0;
}
课时42map
STL
集合set与映射map是两种主要的非线性容器类
内部实现一般为平衡二叉树(balanced binary tree)
map是STL的一个关联容器,它提供一对一的数据处理能力
其中第一个可以称为关键字,每个关键字只能在map中出现一次
第二个可能称为该关键字的值
map的构造
map mapStudent;
map数据的插入
第一种:用insert函数插入pair数据
std::map mapStudent;
mapStudent.insert(pair(1, "student_one"));
第二种:用insert函数插入value_type数据
std::map mapStudent;
mapStudent.insert(map::value_type(1, "student_one"));
map的大小
在网map里面插入了数据,我们怎么知道当前已经插入了多少数据呢,可以用size函数,用法如下:
int nSize = mapStudent.size();
数据的遍历
迭代器
std::map::reverse_iterator iter;
for (iter = mapStudent.rbegin(); iter != mapStudent.rend(); iter++)
{
}
课时43案例讲解--智能指针
案例讲解
智能指针的使用
案例介绍
使用类模板来管理指针
案例设计
创建模板类管理指针。实现资源的管理
#include
#define TRACE printf
class RefCount
{
public:
RefCount()
{
crefs = 0;
}
virtual ~RefCount()
{
}
void upcount()
{
++crefs;
TRACE("up to %d
", crefs);
}
void downcount()
{
if (--crefs == 0)
{
delete this;
}
else
{
TRACE("up to %d
", crefs);
}
}
private:
int crefs;
};
class Sample :public RefCount
{
public:
Sample()
{
}
~Sample()
{
}
void doSomething()
{
printf("Do something
");
}
};
template
class SmartPtr
{
public:
SmartPtr(T *p_) :p(p_)
{
TRACE("constructor SmartPtr
");
p->upcount();
}
~SmartPtr()
{
TRACE("deconstructor SmartPtr
");
p->downcount();
}
operator T*()
{
TRACE("T*(void)
");
return p;
}
T& operator*()
{
TRACE("%s,%d
", __func__, __LINE__);
return *p;
}
T* operator->()
{
TRACE("%s,%d
", __func__, __LINE__);
return p;
}
SmartPtr& operator=(SmartPtr &p_)
{
return operator=((T*)p_);
}
SmartPtr& operator=(T* p_)
{
TRACE("%s,%d
", __func__, __LINE__);
p_->upcount();
p->downcount();
p = p_;
return *this;
}
SmartPtr(const SmartPtr &p_)
{
p = p_.p;
p->upcount();
}
private:
T* p;
};
int main()
{
SmartPtr p = new Sample;
SmartPtr p2 = new Sample;
p = p2;
p->doSomething();
(*p).doSomething();
system("pause");
return 0;
}
constructor SmartPtr
up to 1
constructor SmartPtr
up to 1
T*(void)
operator =,92
up to 2
operator ->,83
Do something
operator *,78
Do something
请按任意键继续. . .