课时35类模板

类模板

创建类模板的实例

class Name<类型参数表>object;

类模板与模板类的区别

类模板是模板的定义,不是一个实实在在的类,定义中用到通用类型参数

模板类是实实在在的类定义。是类模板的实例化。类定义中参数被实际类型所代替

课时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将序列中的元素以升序方式排序

第二种模板和前一个的行为相似,不过它用sort代替了operate<(x, y)

template<class Ranlt>
void sort(Ranlt first, Ranlt last); template<class Ranlt, class Pred>
void sort(Ranlt first, Ranlt last, Pred pr);

示例:使用sort进行排序

#include <iostream>
#include <algorithm>
#include <string>
#include <vector> 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<(const ID& x, const ID& y)//从小到大需要用到
{
return x.score < y.score;
} bool compare(const ID& x, const ID& y)//从大到小需要用到
{
return x.score > y.score;
} int main()
{
std::vector<ID> ids;
std::vector<ID>::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<int, string> mapStudent;

map数据的插入

第一种:用insert函数插入pair数据

	std::map<int, std::string> mapStudent;
mapStudent.insert(pair<int, std::string>(1, "student_one"));

第二种:用insert函数插入value_type数据

std::map<int, std::string> mapStudent;
mapStudent.insert(map<int, std::string>::value_type(1, "student_one"));

map的大小

在网map里面插入了数据,我们怎么知道当前已经插入了多少数据呢,可以用size函数,用法如下:

int nSize = mapStudent.size();

数据的遍历

迭代器

std::map<int, std::string>::reverse_iterator iter;
for (iter = mapStudent.rbegin(); iter != mapStudent.rend(); iter++)
{ }

课时43案例讲解--智能指针

案例讲解

智能指针的使用

案例介绍

使用类模板来管理指针

案例设计

创建模板类管理指针。实现资源的管理

#include <iostream>

#define TRACE printf

class RefCount
{
public:
RefCount()
{
crefs = 0;
}
virtual ~RefCount()
{ } void upcount()
{
++crefs;
TRACE("up to %d\n", crefs);
}
void downcount()
{
if (--crefs == 0)
{
delete this;
}
else
{
TRACE("up to %d\n", crefs);
}
} private:
int crefs;
}; class Sample :public RefCount
{
public:
Sample()
{ }
~Sample()
{ } void doSomething()
{
printf("Do something\n");
}
}; template <typename T>
class SmartPtr
{
public:
SmartPtr(T *p_) :p(p_)
{
TRACE("constructor SmartPtr\n");
p->upcount();
}
~SmartPtr()
{
TRACE("deconstructor SmartPtr\n");
p->downcount();
} operator T*()
{
TRACE("T*(void)\n");
return p;
}
T& operator*()
{
TRACE("%s,%d\n", __func__, __LINE__);
return *p;
}
T* operator->()
{
TRACE("%s,%d\n", __func__, __LINE__);
return p;
}
SmartPtr& operator=(SmartPtr<T> &p_)
{
return operator=((T*)p_);
}
SmartPtr& operator=(T* p_)
{
TRACE("%s,%d\n", __func__, __LINE__);
p_->upcount();
p->downcount();
p = p_;
return *this;
}
SmartPtr(const SmartPtr<T> &p_)
{
p = p_.p;
p->upcount();
} private:
T* p;
}; int main()
{
SmartPtr<Sample> p = new Sample;
SmartPtr<Sample> 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
请按任意键继续. . .

网易云课堂_C++开发入门到精通_章节7:模板的更多相关文章

  1. 网易云课堂_C++开发入门到精通_章节8:设计模式

    课时44设计模式简介 设计模式简介 面向对象设计的第一个原则:针对接口编程,而不是针对实现编程 接口->指针 实现->实例 若已存在一个类Class A,现在希望复用Class A,则有以 ...

  2. 网易云课堂_C++开发入门到精通_章节6:多态

    课时33示例--为多态基类声明虚析构函数 微软校园招聘笔试题 #include <iostream> class Base { public: char Value() { return ...

  3. 网易云课堂_C++开发入门到精通_章节4:运算符重载

    课时23运算符重载 运算符重载 重载赋值运算符 Person& Person::operator=(const Person& other) { //检查自赋值 if (this == ...

  4. 网易云课堂_C++开发入门到精通_章节3: 类、对象和封装

    课时12构造函数与析构函数-2 构造函数 构造函数可以有多个 构造函数可以重载 构造函数用于隐式类型转换 class Student { public: explicit Student(int ss ...

  5. 网易云课堂_C++开发入门到精通_章节2:引用和函数的高级用法

    课时6函数重载 函数重载 在C语言头文件中的extern "C" //常见的C语言头文件格式 #ifndef _FUNC_ #define _FUNC_ #ifdef __cplu ...

  6. 网易云课堂_C++程序设计入门(上)_第6单元:丹枫虽老犹多态–继承与多态_第6单元作业【2】- 在线编程(难度:中)

    第6单元作业[2]- 在线编程(难度:中) 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统 ...

  7. 网易云课堂_C++程序设计入门(上)_第1单元:C++概览_第1单元作业 - 写代码 - 互评 (难度:易)

    第1单元作业 - 写代码 - 互评 (难度:易) 查看帮助 返回   提交作业(截止时间已过) 完成并提交作业     作业批改 互评训练   互评作业   自评作业     成绩公布 查看成绩 温 ...

  8. 网易云课堂_C++程序设计入门(上)_第5单元:万类霜天竞自由 – 对象和类的更多内容_第5单元作业【4】 - 在线编程(难度:难)

    第5单元作业[4] - 在线编程(难度:难) 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系 ...

  9. 网易云课堂_C++程序设计入门(上)_第4单元:物以类聚 – 对象和类_第4单元作业【3】- 在线编程(难度:难)

    1 在本单元作业[1]和作业[2]的基础上,创建一个MyRectangle类,并在main函数中创建类的实例.(10分) 题目难度: 难 题目内容: Screen类: 与作业[2]要求完全相同. 如果 ...

随机推荐

  1. 禁用UITableViewCell 重用机制

    有时候不想让Cell重用,怎么办勒.接下来介绍两种方法 方法一 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAt ...

  2. 使用Open Flash Chart(OFC)制作图表(Struts2处理)

    Java开源项目中制作图表比较出色的就是JFreeChart了,相信大家都听说过,它不仅可以做出非常漂亮的柱状图,饼状图,折线图基本图形之外,还能制作甘特图,仪表盘等图表.在Web应用中可以为项目增色 ...

  3. eclipse在ubuntu13.04下崩溃crash

    错误信息: # # A fatal error has been detected by the Java Runtime Environment: # # SIGSEGV (0xb) at pc=0 ...

  4. classloader.getresources() 介绍

    ◆普通情况下,我们都使用相对路径来获取资源,这种灵活性比較大. 比方当前类为com/bbebfe/Test.class 而图像资源比方sample.gif应该放置在com/bbebfe/sample. ...

  5. 使用Reporting Service订阅对域外用户发邮件

    默认情况下使用Reporting Service对域外邮件发送会失败,一般可能会碰到下面的两个错误: ERROR 1: Subscription Error: "The e-mail add ...

  6. jquery更新后怎样在一个站点中使用两个版本号的jQuery

    公司眼下的项目中的右側导航菜单用到了bootstrap(v3.2.0)的affix.js(Affix插件)与scrospy.js(滚动监听)插件, 须要用到版本号>= 1.9.0的jquery, ...

  7. HttpURLConnection 下载代码

    private int downloadFile(final String apkurl, final String apkname) { Log.e(LOGTAG, "downloadAp ...

  8. Webfrom 上传 单个上传 多个上传

    文件上传控件:FileUpload - 控件,界面+方法+属性Button/LinkButton/ImageButton FileUpload控件:1.SaveAs("要上传到服务器的绝对路 ...

  9. 用GDAL/OGR去读shapefile

    一.读shapefile 1.首先,用Arcgis创建所要读的shp文件.打开ArcCatalog,右键NEW->Shapefile,名称Name:point ,要素类型(Feature Typ ...

  10. mybatis_Generator配置

    mybatis-generator-core-1.3.2 <?xml version="1.0" encoding="UTF-8"?> <!D ...