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

  • 相关阅读:
    python目录操作shutil
    python os.walk
    利用华为eNSP模拟器实现vlan之间的通信
    Python之道1-环境搭建与pycharm的配置django安装及MySQL数据库配置
    利用Excel做一些简单的数据分析
    Django中的枚举类型
    django使用model创建数据库表使用的字段
    ps 命令的十个简单用法
    goinception安装
    docker安装redis 指定配置文件且设置了密码
  • 原文地址:https://www.cnblogs.com/denggelin/p/6206122.html
Copyright © 2020-2023  润新知