课时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. C++小知识之sprintf用法

    sprintf   字串格式化命令,主要功能是把格式化的数据写入某个字符串中.sprintf 是个变参函数,使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访问错误,但好在由sprintf ...

  2. [置顶] Objective-C ,ios,iphone开发基础:在UITextField输入完以后,隐藏键盘,

    在x-code Version 4.3.2 (4E2002)下编译: 在 Controller. m 文件下添加如下实例方法即可: - (void)viewDidUnload { [super vie ...

  3. 提高xshell使用效率

    1.快速命令集. 2.鼠标复制粘贴设置. 3.配色方案. 4.esc切换到英文输入. 设置入口:

  4. Android NDK R9d 安装

    NDK是一个工具集,可让您实现您的应用程序使用本机代码的语言,如C和C + +.Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Go ...

  5. phpcms加载系统类与加载应用类之区别详解

    <?php 1. 加载系统类方法load_sys_class($classname, $path = ''", $initialize = 1)系统类文件所在的文件路径:/phpcms ...

  6. 面试时如何优雅的谈论OC

    在面试中,我们经常会遇到一些原理性的问题,很常识但很难用通俗的语言解释清楚,这也是大部分业务级程序员经常失误的地方.虽然写了多年代码,但是核心思想不清,导致自己的后续发展受限,这是一个优秀的程序员和普 ...

  7. Android软件开发之常用系统控件界面整理

    1.文本框TextView TextView的作用是用来显示一个文本框,下面我用两种方式为大家呈现TextView, 第一种是通过xml布局文件呈现 ,第二种是通过代码来呈现,由此可见Android ...

  8. 在Ubuntu上为Android系统编写Linux内核驱动程序

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6568411 在智能手机时代,每个品牌的手机都有 ...

  9. Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系 ...

  10. (原)ubuntu上安装Torch7及nn及dpnn

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5653864.html 参考网址: http://torch.ch/docs/getting-start ...