一往情深深几许,深山夕照深秋雨。泛型编程:函数模板和类模板函数模板:
template<typename T>      //typename也可使用class
void func(T &a){}两种方式使用模板:1、自动类型推导func(a)2、显式指定类型func<int>(a)模板的目的是为了提高代码的复用性,将类型参数化
注意事项:·自动类型推导,必须推导出一致数据类型T,才可以使用·模板必须要确定出T的数据类型,才可以使用普通函数和模板的区别:自动类型推导   不会发生隐式类型转换显式制定类型    会发生隐式类型转换普通函数和模板函数的调用规则·如果函数模板和普通函数都可以实现,优先调用普通函数·可以通过空模板参数列表来强制调用函数模板·函数模板也可以发生重载·如果函数模板可以产生更好的匹配,优先调用函数模板 模板的局限性:模板并不是万能的,有些特定数据类型,需要用具体化方式做特殊实现·利用具体化的模板,可以解决自定义类型的通用化·学习模板并不是为了写模板,而是在STL能够运用系统提供的模板 类模板:·建立一个通用类,类中的成员 数据类型可以不具体制定,用一个虚拟的类型来代表template<typename T>类template<class NameType, class AgeType>class Person{public:Person(NameType name, AgeType age){this -> m_Name = name;this -> m_Age = age;}NameType m_Name;AgeType m_Age;}void test(){Person<string, int>p1("suwukong", 999);}类模板与函数模板的区别:·类模板没有自动推导的使用方式·类模板在模板参数列表中可以有默认参数类模板中成员函数的创建时机:一开始并不创建在调用的时候才会被创建类模板对象做函数参数类模板实例化出的对象,向函数传参的方式一共有三种传入方式:1、指定传入的类型    --直接显示对象的数据类型2、参数模板化        --将对象的参数变为模板进行传递3、整个类模板化        --将这个对象类型 模板化进行传递类模板与继承:·当子类继承的父类是一个类模板时,子类在声明的时候,要指定出父类中T的类型·如果不指定,编译器无法给子类分配内存·如果想灵活指定出父类中T的类型。子类也需要变为类模板类模板成员函数类外实现:类模板分文件编写:
问题:类模板中成员函数创建时机是在调用阶段,导致分文件编写时链接不到
解决:·一、直接包含.cpp 源文件·二、将声明和实现写到同一个文件中,并更改后缀名为.hpp,hpp是约定名称,并不是强制***********************************************************
面向对象:封装,继承和多态
STL
·standard Template Library
·STL从广义上分为:容器(container)算法(algorithm)迭代器(iterator)
·容器和算法之间通过迭代器进行无缝连接
·STL几乎所有的代码都采用了模板类或者模板函数STL六大组件:容器、算法、迭代器、仿函数、适配器、空间配置器容器:就是讲运用最广泛的一些数据结构实现出来·序列式容器强调值得排序,序列式容器中的每个元素均有固定的位置·关联式容器二叉树结构,各元素之间没有严格的物理上的顺序关系
算法:有限的步骤,解决逻辑或数学上的问题,这一门学科我们叫做算法(algorithm) ·质变算法是指运算过程中会更改区间内元素的内容,例如拷贝、替换、删除等等非质变算法是指运算过程中不会更改区间内元素的内容,例如查找、计数、遍历、寻找极值等等
迭代器:提供一种方法,使之能够依序寻访某个容器所含的各个元素,二又不暴露该容器内部的表示方式string容器
本质:·string是C++风格的字符串,而string本质上是一个类
string和char*的区别:·char*是一个指针 ·string是一个类,类内 不封装了char*,管理这个字符串,是一个char*型的容器。
特点:string类内部封装了很多成员方法例如:查找find,拷贝copy,删除delete,替换replace, 插入insertstring 管理char* 所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责构造函数:
string();                   //创建一个空的字符串,例如:string str;
string(const char* s);      //使用字符串初始化
string(const string& str);  //使用一个string对象初始化里另一个string对象
string(int n, char c);      //使用n个字符c初始化 string赋值操作:
string & operator=(const char* s);     //char*类型字符串 赋值给当前的字符串
string & operator=(const string &s);   //把字符串s赋值给当前的字符串
string & operator=(char c);                //把字符赋值给当前的字符串
string & assign(const char* s);         //把字符串s赋值给当前的字符串
string & assign(const char* s, int n);  //把字符串s的前n个字符赋值给当前的字符串
string & assign(const string &s);       //把字符串s赋值给当前的字符串
string & assign(int n, char c);         //用n个字符c赋值给当前的字符串string查找和替换:
int find(const string & str, int pos = 0)const;        //查找str第一次出现的位置,从pos开始查找
int find(const char* s, int pos = 0)const;         //查找s第一次出现的位置,从pos开始查找
int find(const char* s, int pos, int n)const;       //从pos查找s的前n个字符第一次位置
int find(const char c, int pos = 0)const;          //查找字符c第一次出现的位置,从pos开始查找
int rfind(const string & str, int pos = npos)const;    //查找str最后一次出现的位置,从pos开始查找
int rfind(const char* s, int pos = npos)const;     //查找s最后一次出现的位置,从pos开始查找
int rfind(const char* s, int pos, int n)const;      //从pos查找s的前n个字符最后一次位置
int rfind(const char c, int pos = 0)const;         //查找字符c最后一次出现的位置,从pos开始查找
string & replace(int pos, int n, const string & str);   //替换从pos开始n个字符为字符串str
string & replace(int pos, int n, const char* s);    //替换从pos开始n个字符为字符串sstring字符串比较:
int compare(const string & s) const;    //与字符串s比较,相等则返回 0
int compare(const char* s) const;       //与字符串s比较string字符存取:
char & operator[](int n);               //通过[]方式获取字符
char & at(int n);                       //通过at方式获取字符string插入和删除:
string & insert(int pos, const char*s);             //在pos处插入字符串
string & insert(int pos, const string & str);       //在pos处插入字符串
string & insert(int pos, int n ,char c);            //在pos处插入n个c字符
string & erase(int pos, int n = npos);             //删除pos开始的n个字符string子串:
string substr(int pos = 0; int n = npos) const;       //返回有pos开始的n个字符组成的字符串vector容器:
vector构造函数:
vector<T> v;                  //采用模板实现类实现,默认构造函数
vector(v.begin(), v.end());     //将v[begin(), end())区间中的元素拷贝给本身
vector(n, elem);                //构造函数将n个elem拷贝给本身
vector(const vector & vec);     //拷贝构造函数vector赋值操作:
vector & operator=(const vector &vec);     //重载等号操作符
assign(beg,end);        //将[beg,end)区间中的数据拷贝赋值给本身
assign(n,ele);          //将n个elem拷贝赋值给本身vector容量和大小:
empty();                //判断容器是否为空;
capacity();             //容器的容量
size();                 //返回容器中的个数
resize(int num);        //重新指定容器的长度为num,若容器变长,则以默认值0填充新位置//如果容器变短,则末尾超出容器长度的元素被删除
resize(int num, elem);  //重新指定容器的长度为num,若容器变长,则以elem值填充新位置//如果容器变短,则末尾超出容器长度的元素被删除vector插入和删除:
push_back(ele);                 //尾部插入元素ele
pop_back();                     //删除最后一个元素
insert(const_iterator pos, ele);//迭代器指向位置pos插入元素ele
insert(const_iterator pos, int n,ele);  //迭代器指向位置pos插入n个元素ele
erase(const_iterator pos);      //删除迭代器指向的元素
erase(const_iterator start, const_iterator end) //删除迭代器从start到end之间的元素
clear();                        //删除容器中所有的元素vector数据存取:
at(int idx);        //返回索引idx所指的数据
operator[];         //返回索引idx所指的数据
front();            //返回容器中第一个数据
back();             //返回容器中最后一个数据元素vector互换容器:
swap(vec);                  //将vec与本身的元素互换
vector<int>(vec).swap(vec)    //收缩内存 vector预留空间:
reserve(int len);       //容器预留len个元素长度,预留位置不初始化,元素不可访问deque容器:·双端队列。可以对头端和尾部进行插入删除操作
deque与vector的区别:·vector对于头部插入删除效率低,数据量越大,效率越低·deque相对而言,对头部的插入删除速度比vector快·vector访问元素的速度会比deque快,这和两者的内部实现有关deque内部工作原理:deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间·deque容器的迭代器也是支持随机访问的deque构造函数:
deque<T> deqT;                    //采用模板实现类实现,默认构造函数
deque(deq.begin(), deq.end());  //将deq[begin(), end())区间中的元素拷贝给本身
deque(n, elem);                 //构造函数将n个elem拷贝给本身
deque(const deque & deq);       //拷贝构造函数vector赋值操作:
deque & operator=(const deque &deq);       //重载等号操作符
assign(beg,end);        //将[beg,end)区间中的数据拷贝赋值给本身
assign(n,ele);          //将n个elem拷贝赋值给本身deque和大小:            //deque是没有容量(capacity)的概念的
empty();                //判断容器是否为空;
size();                 //返回容器中的个数
resize(int num);        //重新指定容器的长度为num,若容器变长,则以默认值0填充新位置//如果容器变短,则末尾超出容器长度的元素被删除
resize(int num, elem);  //重新指定容器的长度为num,若容器变长,则以elem值填充新位置//如果容器变短,则末尾超出容器长度的元素被删除deque插入和删除:           //pos的位置是迭代器,eg: deque.begin(),deque.end()
push_back(ele);             //尾部插入元素ele
push_front(ele);            //头部插入元素ele
pop_back();                 //删除最后一个元素
pop_front();                //删除第一个元素
insert(pos, ele);           //在pos位置插入一个ele元素的拷贝,返回新数据的位置
insert(pos, n, ele);        //在pos位置插入n个ele数据,无返回值
insert(pos, begin, end);    //在pos位置插入[begin,end)区间的数据,无返回值
clear();                    //删除容器中所有的元素
erase(begin, end)           //删除[begin,end)区间的数据,返回下一个数据的位置
erase(pos);                 // 删除pos未知的数据,返回下一个数据的位置 deque数据存取:
at(int idx);        //返回索引idx所指的数据
operator[];         //返回索引idx所指的数据
front();            //返回容器中第一个数据
back();             //返回容器中最后一个数据元素deque排序
#include <algorithm>
sort(iterator begin, iterator end)  //对begin到end区间内的元素进行排序//对于支持随机访问的迭代器的容器,都可以利用sort算法直接对其进行排序  stack容器:
概念:stack是一种先进后出(First in Last out, FILO)的数据结构,它只有一个出口常用接口:
构造函数:
stack<T> stk;             //stack采用模板实现,stack对象默认构造形式
stack(const stack &stk);    //拷贝构造函数赋值操作:
stack & operator=(const stack &stk);   //重载=操作符数据存取:
push(elem);                 //向栈顶添加元素
pop();                      //从栈顶移除第一个元素
top();                      //返回栈顶元素
empty();                    //判断堆栈是否为空
size();                     //返回栈的大小queue容器:
概念:Queue是一种先进先出(First in First out, FIFO)的数据结构,它有连个出口
常用接口:
构造函数:
queue<T> que;             //queue采用模板类实现,queue对象的默认构造形式
queue(const queue &que);    //拷贝构造函数赋值操作:
queue & operator=(const queue &que);   //重载=操作符数据存取:
push(elem);                 //往队尾添加元素
pop();                      //从对头移除第一个元素
back();                     //返回最后一个元素
front();                    //返回第一个元素
empty();                    //判断队列是否为空
size();                     //返回队列大小 list容器:
功能:将数据进行链式存储
链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的
链表的组成:链表是由一系列结点组成
结点组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域
STL中的链表是一个双向循环列表优点:采用动态分配,不会造成内存浪费和溢出链表执行插入合入删除操作十分方便,修改指针即可,不需要移动大量元素
缺点:链表灵活,单数空间(指针域)和时间(遍历)额外耗费较大
LIst的重要性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的。list构造函数:
list<T> lst;              //list采用模板类实现,对象的默认构造形式
list(begin, end);           //构造函数将[beg, end)区间中的元素拷贝给本身。
list(const list &lst);      //拷贝构造函数
list(n, elem);              //构造函数将n个elem拷贝给本身
list的赋值和交换:
assign(begin, end);                 //将[begin, end)区间中的数据拷贝赋值给本身
assign(n, ele);                     //将n个elem拷贝赋值给本身
list& operator=(const list &lst);  //重载等号操作符
swap(lst);                          //将lst与本身元素互换list大小操作:
size();             //返回容器中元素的个数
empty();            //判断容器是否为空
resize(num);        //重新指定容器的长度为num,若容器变长,则以默认值填充新位置//如果容器变短,则末尾长处容器长度的元素被删除
resize(num ,elem)   //重新指定容器的长度为num,若容器变长,则elem填充新位置//如果容器变短,则末尾长处容器长度的元素被删除 list插入和删除:
push_back(elem);        //在容器尾部添加一个元素
pop_back();             //删除容器中最后一个元素
push_front(elem);       //在容器开头插入一个元素
pop_front();            //从容器开头移除第一个元素
insert(pos, elem);      //在pos位置插入elem元素的拷贝,返回新的数据位置
insert(pos, n, elem);   //在pos位置插入n个elem元素的拷贝,无返回值
insert(pos, begin, end);//在pos位置插入[begin, end)区间的数据,无返回值
clear();                //移除容器中的所有数据
erase(begin, end);      //删除[begin, end)区间的数据,返回下一个数据的位置
erase(pos);             //删除pos位置的数据,返回下一个数据的位置
remove(elem);           //删除容器中所有的与elem值匹配的元素 list数据存取,排序,反转:
front();                //返回第一个元素
back();                 //返回最后一个元素
reverse();              //反转链表
sort();                 //链表排序set/multiset容器:
set基本概念:所有元素都会在插入时自动排序
本质:set/multiset属于关联式容器,底层结构是用二叉树实现。
set和multiset区别:set不允许容器中有重复元素multiset允许容器中有重复元素set构造和赋值:
set<T> st;                        //默认构造函数
set(const set &st);             //拷贝构造函数set & operator=(const set &st);    //重载等号操作符 size();           //返回容器中元素的数目
empty();        //判断容器是否为空
swap(st);       //交换两个容器 set插入和删除:
insert(elem);           //在容器中插入元素
clear();                //清除所有元素
erase(pos);             //删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(begin, end);      //删除区间[begin, end)的所有元素,返回下一个元素的迭代器
erase(ele);             //删除容器中值为ele的元素set查找和统计:
find(key);      //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回,set.end();
count(key);     //统计key的元素个数pair对组:
pair<type,type> p (value1, value2);
pair<type,type> p = make_pair(value1, value2);set容器排序:
自定义的数据类型,都要指定排序规则
仿函数map/multimap容器:
map基本概念:map中所有元素都是pairpair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)所有元素都会根据元素的键值排序
本质:map/multimap属于关联式容器,底层结构是二叉树实现
优点:可以根据key快速找到value值
map和multimap的区别:map不容许容器中有重复key值元素multimap允许容器中有重复的key值元素map构造函数和赋值:
//map中所有元素都是成对出现,插入数据的时候要使用对组
map<T1, T2> mp;                   //map默认构造函数
map(const map &mp);             //拷贝构造函数
map& operator=(const map &mp); //重载等号操作符map的大小和交换:
size();             //返回容器中元素的数目
empty();            //判断容器是否为空
swap(mp);           //交换两个集合容器map插入和删除:
insert(elem);       //在容器中插入元素elem
clear();            //清除所有元素
erase(pos);         //删除pos迭代器所指的元素,返回下一个元素
erase(begin,end);   //删除区间[begin, end)的所有元素,返回下一个元素的迭代器
erase(key);         //删除容器中值为key的元素map查找和统计:
find(key);          //查找key是否存在,若存在,则返回该键的元素的迭代器;若不存在,返回set.end()
cout(key);          //统计key元素的个数map容器排序:
map容器默认排序规则为:按照key值进行 从小到大排序
利用仿函数,改变排序规则

*黑马程序员c++课程学习笔记

泛型编程和STL基础学习(C++)(未完待续)相关推荐

  1. pythonb超分辨成像_Papers | 超分辨 + 深度学习(未完待续)

    1. SRCNN 1.1. Contribution end-to-end深度学习应用在超分辨领域的开山之作(非 end-to-end 见 Story.3 ). 指出了超分辨方向上传统方法( spar ...

  2. 【音频播放】自制音频播放器—音视频基础概念,未完待续。。。

    近期用Electron制作了一个简易版客户端,未完待补充,重点在播放,引用凯教,先说几点.(图片禁止搬运,不得允许不准转载) 研究音频的数字化技术之前,必须对声音和图像的的物理性质有基本的了解. 如下 ...

  3. Linux学习总结 (未完待续...)

    Linux学习总结: 1.用户管理部分 a,用户与组配置文件 a1.与用户和组相关的配置文件:passwd,shadow group,gshadow a2.超级权限控制Sudo的配置文件:/etc/s ...

  4. c++课程学习(未完待续)

    关于c++课程学习 按照计划,我首先阅读谭浩强c++程序设计一书的ppt,发现第一章基本上都是很基础的东西. 同时,书中与班导师一样,推荐了使用visual c++. 而师爷的教程里面推荐使用的是ec ...

  5. 虚拟机安装后的基础配置(未完待续)

    版本:Centos 6.10 虚拟机安装完成后,需要进行一些基础配置,才能进行操作. 1.安装xshell(可选),下一步安装即可. 2.安装xftp(可选,用于上传文件,如安装包等),下一步安装即可 ...

  6. TS学习笔记 ---未完待续....

    TS学习笔记 1 .ts文件与.tsx文件有什么区别 2.使用TS之前需要配置 3.TS特性 泛型和类型注解有什么区别? 3.什么是泛型参数? 4.函数.类.接口有什么区别? 4.1 一个class不 ...

  7. Multimodal Deep Learning(多模态深度学习)未完待续

    摘要: 本文提出一种在深度网络上的新应用,用深度网络学习多模态.特别的是,我们证明了跨模态特征学习--如果在特征学习过程中多模态出现了,对于一个模态而言,更好的特征可以被学习(多模态上学习,单模态上测 ...

  8. # Python基础笔记(未完待续)

    写在前面:小白闲来无事,参考小甲鱼视频重温Python,所及笔记,仅供参考.第一次写长笔记,格式较乱,请谅解 一.数据类型 1.输入路径 >>>print("D:\thre ...

  9. linux安装java学习环境(未完待续)

    linux安装java学习环境 数据库连接命令 连接mysql数据库 格式为: mysql -hip地址 -p端口号 -u root -p 输入密码例如: mysql -hlocalhost -p33 ...

最新文章

  1. 在当当买了python怎么下载源代码-python爬虫爬取当当网
  2. Geoserver常见问题总结
  3. [APIO2014] 序列分割(斜率优化dp)
  4. 太原师范学院计算机二级报名,山西计算机等级考试报名地点
  5. python中错误和异常处理
  6. SSM-物流管理常见问题4 前端向后端传递数据
  7. 读书笔记--Head First Programming 目录
  8. Stata | 导入导出文件
  9. 并发编程、并行、多线程、锁、同步、异步、多线程、单线程、阻塞io、非阻塞io
  10. ios 纯代码怎么适配ipad_关于ios 适配ihone 和 ipad方式
  11. 手机百度浏览器怎么设置繁体字_繁体字转换简体字在线转换_有什么软件可以把繁...
  12. 萨姆休斯顿州立大学计算机专业,萨姆休斯顿州立大学排名在2020年USNEWS美国最佳综合大学排名第281...
  13. 自从看了<<麦肯锡的领导力法则>>之后......
  14. Spring| Spring中的动态代理配置(aspectj-autoproxy属性介绍)
  15. Ubuntu Linux 操作系统-清华大学开源软件镜像站下载
  16. http://www.horizon3d.com.cn
  17. netkeeper客户端_netkeeper
  18. 宁夏统编中学计算机教材,中小学三科教材的统编
  19. linux系统命令-查看内存使用情况
  20. 如何创建一个好看且简约的网页

热门文章

  1. 邮箱激活功能,前台用户注册后需要登录邮箱激活账号才能够登录的,请简述激活过程,重点是安全性
  2. Pr:导出设置之编码设置
  3. MAC创建ipv6热点
  4. 剑指offer算法题028:数组中出现次数超过一半的数字
  5. 2个相同的 stm32 can通讯不成功_CAN通讯系列--CAN通讯简介1
  6. php 模拟微信登录,PHP 模拟登录微信公众平台
  7. 拉取并且mongo保存聚宽的期货分钟线数据
  8. alios 系统配置转存到一个头文件
  9. 【MOOC-生物信息学-生物数据库】
  10. 数学基础知识总结 —— 9. 什么是拉格朗日乘数法(Lagrange Multiplier,有约束条件的多元函数求极值)