课时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. 《Java程序员面试笔试宝典》之Java与C/C++有什么异同

    Java与C++都是面向对象语言,都使用了面向对象思想(例如封装.继承.多态等),由于面向对象有许多非常好的特性(继承.组合等),使得二者都有很好的可重用性. 需要注意的是,二者并非完全一样,下面主要 ...

  2. PC-CSS-默认字体样式

    字体样式:Arial:字体大小:12px;行高:1.5倍:

  3. Android学习总结——本地广播机制

    为了简单解决广播的安全性问题,Android引入了一套本地广播机制,使用这个机制发出的广播只能在程序的内部进行传递,只能接受来自本应用程序发出的广播.否则当我们发送一些携带关键数据的广播可能被截获,一 ...

  4. SQL 2008存储图片和读取图片

    用SQL Server存储文字数据非常easy实现,假设用SQL Server存储图片呢?大家有没有实现思路呢?如今我用一个Demo来为大家提供一种在SQL Server中存储图片的思路. 场景:在s ...

  5. linux内核--内存管理(二)

    一.进程与内存     所有进程(执行的程序)都必须占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等.不过进程对这些内存的管理方式因内存用途不一而不尽相同,有些内 ...

  6. Android-JNI编程-图文解析

    要想阅读并调试下文源码,首先要确保你的NDK环境是ok的:        编译环境:win7+Eclipse+ADT+SDK+NDK:基本用最新的就ok.        说明下,下文代码就是一个简单的 ...

  7. SSO之CAS基础及应用视频教程(2)

    CAS介绍 CAS = Central Authentication Service,中央认证服务.CAS 是 Yale 大学发起的一个开源项目,能够为 Web 应用系统或者非Web应用系统提供一种可 ...

  8. Ant命令行操作

    Ant命令行操作 Ant构建文件可以将项目编译,打包,測试,它是Apache软件基金会jakarta文件夹中的一个子项目,具有跨平台性,操作简单,并且非常easy上手. 关于Ant执行,能够在项目中找 ...

  9. System.Threading.Timer的使用技巧

    转自:http://www.360doc.com/content/11/0812/11/1039473_139824496.shtml# System.Threading.Timer timer = ...

  10. NPOI通过DataTable导出和读取Excel

    Excel导入及导出问题产生: 从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题: 导出问题: 如果是asp.net,你得 ...