网易云课堂_C++开发入门到精通_章节7:模板
课时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:模板的更多相关文章
- 网易云课堂_C++开发入门到精通_章节8:设计模式
课时44设计模式简介 设计模式简介 面向对象设计的第一个原则:针对接口编程,而不是针对实现编程 接口->指针 实现->实例 若已存在一个类Class A,现在希望复用Class A,则有以 ...
- 网易云课堂_C++开发入门到精通_章节6:多态
课时33示例--为多态基类声明虚析构函数 微软校园招聘笔试题 #include <iostream> class Base { public: char Value() { return ...
- 网易云课堂_C++开发入门到精通_章节4:运算符重载
课时23运算符重载 运算符重载 重载赋值运算符 Person& Person::operator=(const Person& other) { //检查自赋值 if (this == ...
- 网易云课堂_C++开发入门到精通_章节3: 类、对象和封装
课时12构造函数与析构函数-2 构造函数 构造函数可以有多个 构造函数可以重载 构造函数用于隐式类型转换 class Student { public: explicit Student(int ss ...
- 网易云课堂_C++开发入门到精通_章节2:引用和函数的高级用法
课时6函数重载 函数重载 在C语言头文件中的extern "C" //常见的C语言头文件格式 #ifndef _FUNC_ #define _FUNC_ #ifdef __cplu ...
- 网易云课堂_C++程序设计入门(上)_第6单元:丹枫虽老犹多态–继承与多态_第6单元作业【2】- 在线编程(难度:中)
第6单元作业[2]- 在线编程(难度:中) 查看帮助 返回 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统 ...
- 网易云课堂_C++程序设计入门(上)_第1单元:C++概览_第1单元作业 - 写代码 - 互评 (难度:易)
第1单元作业 - 写代码 - 互评 (难度:易) 查看帮助 返回 提交作业(截止时间已过) 完成并提交作业 作业批改 互评训练 互评作业 自评作业 成绩公布 查看成绩 温 ...
- 网易云课堂_C++程序设计入门(上)_第5单元:万类霜天竞自由 – 对象和类的更多内容_第5单元作业【4】 - 在线编程(难度:难)
第5单元作业[4] - 在线编程(难度:难) 查看帮助 返回 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系 ...
- 网易云课堂_C++程序设计入门(上)_第4单元:物以类聚 – 对象和类_第4单元作业【3】- 在线编程(难度:难)
1 在本单元作业[1]和作业[2]的基础上,创建一个MyRectangle类,并在main函数中创建类的实例.(10分) 题目难度: 难 题目内容: Screen类: 与作业[2]要求完全相同. 如果 ...
随机推荐
- 《Java程序员面试笔试宝典》之Java与C/C++有什么异同
Java与C++都是面向对象语言,都使用了面向对象思想(例如封装.继承.多态等),由于面向对象有许多非常好的特性(继承.组合等),使得二者都有很好的可重用性. 需要注意的是,二者并非完全一样,下面主要 ...
- PC-CSS-默认字体样式
字体样式:Arial:字体大小:12px;行高:1.5倍:
- Android学习总结——本地广播机制
为了简单解决广播的安全性问题,Android引入了一套本地广播机制,使用这个机制发出的广播只能在程序的内部进行传递,只能接受来自本应用程序发出的广播.否则当我们发送一些携带关键数据的广播可能被截获,一 ...
- SQL 2008存储图片和读取图片
用SQL Server存储文字数据非常easy实现,假设用SQL Server存储图片呢?大家有没有实现思路呢?如今我用一个Demo来为大家提供一种在SQL Server中存储图片的思路. 场景:在s ...
- linux内核--内存管理(二)
一.进程与内存 所有进程(执行的程序)都必须占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等.不过进程对这些内存的管理方式因内存用途不一而不尽相同,有些内 ...
- Android-JNI编程-图文解析
要想阅读并调试下文源码,首先要确保你的NDK环境是ok的: 编译环境:win7+Eclipse+ADT+SDK+NDK:基本用最新的就ok. 说明下,下文代码就是一个简单的 ...
- SSO之CAS基础及应用视频教程(2)
CAS介绍 CAS = Central Authentication Service,中央认证服务.CAS 是 Yale 大学发起的一个开源项目,能够为 Web 应用系统或者非Web应用系统提供一种可 ...
- Ant命令行操作
Ant命令行操作 Ant构建文件可以将项目编译,打包,測试,它是Apache软件基金会jakarta文件夹中的一个子项目,具有跨平台性,操作简单,并且非常easy上手. 关于Ant执行,能够在项目中找 ...
- System.Threading.Timer的使用技巧
转自:http://www.360doc.com/content/11/0812/11/1039473_139824496.shtml# System.Threading.Timer timer = ...
- NPOI通过DataTable导出和读取Excel
Excel导入及导出问题产生: 从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题: 导出问题: 如果是asp.net,你得 ...