课时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删除文件夹下所有文件

    package org.sw; import java.io.File; /** * * @author mengzw * @since 3.0 2014-2-26 */ public class D ...

  2. Guice 学习(六)使用Provider注入服务( Provider Inject Service)

    1.定义接口 package com.guice.providerInject; import com.google.inject.ProvidedBy; public interface Servi ...

  3. 第04章-VTK基础(4)

    [译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934- ...

  4. NuGet学习笔记(2)——使用图形化界面打包自己的类库(转)

    上文NuGet学习笔记(1) 初识NuGet及快速安装使用说到NuGet相对于我们最重要的功能是能够搭建自己的NuGet服务器,实现公司内部类库的轻松共享更新.在安装好NuGet扩展后,我们已经能够通 ...

  5. 使用安卓中的TextToSpeech控件实现朗读文字

    首先感谢原文的博主,本文中的代码均来自该博主:(原文地址)http://flycatdeng.iteye.com/blog/1827245 朗读文字不需要任何的权限,这个控件的好处是首先不要权限,其次 ...

  6. [Python][MachineLeaning]Python Scikit-learn学习笔记1-Datasets&Estimators

    Scikit-learn官网:http://scikit-learn.org/stable/index.html Datasets 标准的数据集格式为一组多维特征向量组成的集合.数据集的标准形状(sh ...

  7. myeclipse8.6 for spring环境配置

     

  8. C# 十进制和十六进制转换

    转至:http://www.cnblogs.com/fwind/archive/2012/04/13/2445380.html 在C#中,十进制和十六进制转换非常简单,方法如下: 十进制转为十六进制: ...

  9. 已知TSP问题的最好解

    a280 : 2579ali535 : 202339att48 : 10628att532 : 27686bayg29 : 1610bays29 : 2020berlin52 : 7542bier12 ...

  10. MFC串口通信

    1.串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式). 同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程) ...