网易云课堂html模版,网易云课堂_C++开发入门到精通_章节7:模板

课时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

请按任意键继续. . .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值