C++
C++
杨林伟
一个人走到何种境地,全都因为自己!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
93 C++ - STL综合案例
演讲比赛案例比赛规则:某市举行一场演讲比赛( speech_contest ),共有24个人参加。比赛共三轮,前两轮为淘汰赛,第三轮为决赛。比赛方式:分组比赛,每组6个人;选手每次要随机分组,进行比赛;第一轮分为4个小组,每组6个人。比如编号为: 100-123. 整体进行抽签(draw)后顺序演讲。当小组演讲完后,淘汰组内排名最后的三个选手,然后继续下一个小组的比赛。第二轮分为2个...原创 2019-10-09 17:25:17 · 635 阅读 · 0 评论 -
92 C++ - 常用集合算法
/* set_intersection算法 求两个set集合的交集 注意:两个集合必须是有序序列 @param beg1 容器1开始迭代器 @param end1 容器1结束迭代器 @param beg2 容器2开始迭代器 @param end2 容器2结束迭代器 @param dest 目标容器开始迭代器 @return 目标容器的最后一个元素的迭代器地址*/set_int...原创 2019-10-09 17:13:52 · 691 阅读 · 0 评论 -
91 C++ - 常用算数生成算法
/* accumulate算法 计算容器元素累计总和 @param beg 容器开始迭代器 @param end 容器结束迭代器 @param value累加值*/accumulate(iterator beg, iterator end, value)/* fill算法 向容器中添加元素 @param beg 容器开始迭代器 @param end 容器结束迭代器 @para...原创 2019-10-09 17:11:53 · 515 阅读 · 0 评论 -
90 C++ - 常用拷贝和替换算法
/* copy算法 将容器内指定范围的元素拷贝到另一容器中 @param beg 容器开始迭代器 @param end 容器结束迭代器 @param dest 目标起始迭代器*/copy(iterator beg, iterator end, iterator dest)/* replace算法 将容器内指定范围的旧元素修改为新元素 @param beg 容器开始迭代器 @pa...原创 2019-10-09 16:51:28 · 660 阅读 · 0 评论 -
89 C++ - 常用排序算法
/* merge算法 容器元素合并,并存储到另一容器中 @param beg1 容器1开始迭代器 @param end1 容器1结束迭代器 @param beg2 容器2开始迭代器 @param end2 容器2结束迭代器 @param dest 目标容器开始迭代器*/merge(iterator beg1, iterator end1, iterator beg2, itera...原创 2019-10-09 16:45:58 · 529 阅读 · 0 评论 -
88 C++ - 常用查找算法
/* find算法 查找元素 @param beg 容器开始迭代器 @param end 容器结束迭代器 @param value 查找的元素 @return 返回查找元素的位置*/find(iterator beg, iterator end, value)/* find_if算法 条件查找 @param beg 容器开始迭代器 @param end 容器结束迭代器 @p...原创 2019-10-09 16:41:29 · 554 阅读 · 0 评论 -
87 C++ - 常用遍历算法
/* 遍历算法 遍历容器元素 @param beg 开始迭代器 @param end 结束迭代器 @param _callback 函数回调或者函数对象 @return 函数对象*/for_each(iterator beg, iterator end, _callback);/* transform算法 将指定容器区间元素搬运到另一容器中 注意 : transform...原创 2019-10-09 16:37:10 · 693 阅读 · 0 评论 -
86 C++ - 算法头文件
算法主要是由头文件<algorithm> 、<functional>、 <numeric>组成。<algorithm>是所有STL头文件中最大的一个,其中常用的功能涉及到比较,交换,查找,遍历,复制,修改,反转,排序,合并等…<numeric>体积很小,只包括在几个序列容器上进行的简单运算的模板函数.<functional&g...原创 2019-10-09 16:35:33 · 694 阅读 · 0 评论 -
85 C++ - 函数对象适配器
函数适配器bind1st bind2nd现在我有这个需求 在遍历容器的时候,我希望将容器中的值全部加上100之后显示出来,怎么做?我们直接给函数对象绑定参数 编译阶段就会报错for_each(v.begin(), v.end(), bind2nd(myprint(),100));如果我们想使用绑定适配器,需要我们自己的函数对象继承binary_function 或者 unary_func...原创 2019-10-09 16:33:32 · 521 阅读 · 0 评论 -
84 C++ - 内建函数对象
STL内建了一些函数对象。分为:算数类函数对象,关系运算类函数对象,逻辑运算类仿函数。这些仿函数所产生的对象,用法和一般函数完全相同,当然我们还可以产生无名的临时对象来履行函数功能。使用内建函数对象,需要引入头文件#include<functional>。6个算数类函数对象,除了negate是一元运算,其他都是二元运算template<class T> T plus&l...原创 2019-10-09 16:32:05 · 573 阅读 · 0 评论 -
83 C++ - 谓词
谓词是指普通函数或重载的operator()返回值是bool类型的函数对象(仿函数)。如果operator接受一个参数,那么叫做一元谓词,如果接受两个参数,那么叫做二元谓词,谓词可作为一个判断式。class GreaterThenFive{public: bool operator()(int num) { return num > 5; }};//一元谓词void ...原创 2019-10-09 16:29:43 · 518 阅读 · 0 评论 -
82 C++ - 函数对象
重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对象可以像函数那样调用。注意:1.函数对象(仿函数)是一个类,不是一个函数。2.函数对象(仿函数)重载了”() ”操作符使得它可以像函数一样调用。分类:假定某个类有一个重载的operator(),而且重载的opera...原创 2019-10-09 16:18:02 · 501 阅读 · 0 评论 -
81 C++ - STL容器使用时机
vector的使用场景 :比如软件历史操作记录的存储,我们经常要查看历史记录,比如上一次的记录,上上次的记录,但却不会去删除记录,因为记录是事实的描述。deque的使用场景 :比如排队购票系统,对排队者的存储可以采用deque,支持头端的快速移除,尾端的快速添加。如果采用vector,则头端移除时,会移动大量的数据,速度慢。vector与deque的比较: 一:vector.at()比de...原创 2019-10-09 16:12:48 · 520 阅读 · 0 评论 -
80 C++ - map/multimap容器
1. map/multimap基本概念Map的特性是,所有元素都会根据元素的键值自动排序。Map所有的元素都是pair,同时拥有实值和键值,pair的第一元素被视为键值,第二元素被视为实值,map不允许两个元素有相同的键值。我们可以通过map的迭代器改变map的键值吗?答案是不行,因为map的键值关系到map元素的排列规则,任意改变map键值将会严重破坏map组织。如果想要修改元素的实值,那么...原创 2019-10-09 16:10:28 · 480 阅读 · 0 评论 -
79 C++ - set/multiset容器
1. set/multiset容器1.1 set容器基本概念Set的特性是。所有元素都会根据元素的键值自动被排序。Set的元素不像map那样可以同时拥有实值和键值,set的元素即是键值又是实值。Set不允许两个元素有相同的键值。我们可以通过set的迭代器改变set元素的值吗?不行,因为set元素值就是其键值,关系到set元素的排序规则。如果任意改变set元素值,会严重破坏set组织。换句话说...原创 2019-10-09 16:00:51 · 493 阅读 · 0 评论 -
78 C++ - list容器
1. list容器基本概念链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。相较于vector的连续线性空间,list就显得负责许多,它的好处是每次插入或者删除一个元素,就是配置或者...原创 2019-10-09 15:51:31 · 385 阅读 · 0 评论 -
77 C++ - queue容器
1. queue容器基本概念Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口,queue容器允许从一端新增元素,从另一端移除元素。2. queue没有迭代器Queue所有元素的进出都必须符合”先进先出”的条件,只有queue的顶端元素,才有机会被外界取用。Queue不提供遍历功能,也不提供迭代器。3. queue常用API3.1 que...原创 2019-10-09 15:45:42 · 328 阅读 · 0 评论 -
75 C++ - deque容器
1. deque容器基本概念Vector容器是单向开口的连续内存空间,deque则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,当然,vector容器也可以在头尾两端插入元素,但是在其头部操作效率奇差,无法被接受。Deque容器和vector容器最大的差异,一在于deque允许使用常数项时间对头端进行元素的插入和删除操作。二在于deque没有容...原创 2019-10-09 15:40:14 · 617 阅读 · 0 评论 -
74 C++ - vector容器
1. vector容器基本概念vector的数据安排以及操作方式,与array非常相似,两者的唯一差别在于空间的运用的灵活性。Array是静态空间,一旦配置了就不能改变,要换大一点或者小一点的空间,可以,一切琐碎得由自己来,首先配置一块新的空间,然后将旧空间的数据搬往新空间,再释放原来的空间。Vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素。因此vector的运用对...原创 2019-10-09 15:36:26 · 375 阅读 · 0 评论 -
73 C++ - string容器
1. string容器基本概念C风格字符串(以空字符结尾的字符数组)太过复杂难于掌握,不适合大程序的开发,所以C++标准库定义了一种string类,定义在头文件<string>。String和c风格字符串对比:Char*是一个指针,String是一个类string封装了char*,管理这个字符串,是一个char*型的容器。String封装了很多实用的成员方法查找fi...原创 2019-10-09 15:30:58 · 351 阅读 · 0 评论 -
72 C++ - STL三大组件
1. 容器容器,置物之所也。研究数据的特定排列方式,以利于搜索或排序或其他特殊目的,这一门学科我们称为数据结构。大学信息类相关专业里面,与编程最有直接关系的学科,首推数据结构与算法。几乎可以说,任何特定的数据结构都是为了实现某种特定的算法。STL容器就是将运用最广泛的一些数据结构实现出来。常用的数据结构:数组(array),链表(list),tree(树),栈(stack),队列(queue...原创 2019-10-09 15:05:56 · 740 阅读 · 0 评论 -
71 C++ - STL概论
长久以来,软件界一直希望建立一种可重复利用的东西,以及一种得以制造出”可重复运用的东西”的方法,让程序员的心血不止于随时间的迁移,人事异动而烟消云散,从函数(functions),类别(classes),函数库(function libraries),类别库(class libraries)、各种组件,从模块化设计,到面向对象(object oriented ),为的就是复用性的提升。复用性必须...原创 2019-10-09 15:01:15 · 495 阅读 · 0 评论 -
70 C++ - 文件读写
1. 文件流类和文件流对象输入输出是以系统指定的标准设备(输入设备为键盘,输出设备为显示器)为对象的。在实际应用中,常以磁盘文件作为对象。即从磁盘文件读取数据,将数据输出到磁盘文件。和文件有关系的输入输出类主要在fstream.h这个头文件中被定义,在这个头文件中主要被定义了三个类,由这三个类控制对文件的各种输入输出操作,他们分别是ifstream、ofstream、fstream,其中fst...原创 2019-10-09 14:45:14 · 728 阅读 · 0 评论 -
69 C++ - 标准输出流
1. 字符输出cout.flush() //刷新缓冲区 Linux下有效cout.put()//向缓冲区写字符cout.write()//从buffer中写num个字节到当前输出流中。//cout.flush 刷新缓冲区,linux下有效void test01(){ cout << "hello world"; //刷新缓冲区 cout.flush(); }...原创 2019-10-09 14:35:26 · 605 阅读 · 0 评论 -
68 C++ - 标准输入流
标准输入流对象cin,重点掌握的函数cin.get() //一次只能读取一个字符cin.get(一个参数) //读一个字符cin.get(两个参数)//可以读字符串cin.getline()cin.ignore()cin.peek()cin.putback()//cin.getvoid test01(){#if 0 char ch = cin.get(); cout &...原创 2019-10-09 14:30:59 · 525 阅读 · 0 评论 -
67 C++ - 标准I/O流
标准I/O对象:cin 、cout 、cerr 、clogcout流对象cout是console output的缩写,意为在控制台(终端显示器)的输出。强调几点。cout不是C++预定义的关键字,它是ostream流类的对象,在iostream中定义。 顾 名思义,流是流动的数据,cout流是流向显示器的数据。cout流中的数据是用流插入 运算符“<<”顺序加入的。如果有:c...原创 2019-10-09 14:29:42 · 409 阅读 · 0 评论 -
66 C++ - 流的概念和流类库的结构
程序的输入指的是从输入文件将数据传送给程序,程序的输出指的是从程序将数据传送给输出文件。C++输入输出包含以下三个方面的内容:对系统指定的标准设备的输入和输出。即从键盘输入数据,输出到显示器屏幕。这种输入输出称为标准的输入输出,简称标准I/O。以外存磁盘文件为对象进行输入和输出,即从磁盘文件输入数据,数据输出到磁盘文件。以外存文件为对象的输入输出称为文件的输入输出,简称文件I/O。...原创 2019-10-09 14:24:45 · 678 阅读 · 2 评论 -
65 C++ - 自定义异常
① 标准库中的异常是有限的;② 在自己的异常类中,可以添加自己的信息。(标准库中的异常类值允许设置一个用来描述异常的字符串)。如何编写自己的异常类?① 建议自己的异常类要继承标准异常类。因为C++中可以抛出任何类型的异常,所以我们的异常类可以不继承自标准异常,但是这样可能会导致程序混乱,尤其是当我们多人协同开发时。② 当继承标准异常类时,应该重载父类的what函数和虚析构函数。③ 因为栈...原创 2019-10-09 14:17:05 · 806 阅读 · 0 评论 -
64 C++ - 标准异常库
标准库中也提供了很多的异常类,它们是通过类继承组织起来的。异常类继承层级结构图如下:每个类所在的头文件在图下方标识出来。标准异常类的成员:① 在上述继承体系中,每个类都有提供了构造函数、复制构造函数、和赋值操作符重载。② logic_error类及其子类、runtime_error类及其子类,它们的构造函数是接受一个string类型的形式参数,用于异常信息的描述③ 所有的异常类都...原创 2019-10-09 14:15:26 · 701 阅读 · 0 评论 -
63 C++ - 异常语法
1. 异常基本语法int A_MyDivide(int a, int b){ if (b == 0){ throw 0; } return a / b;}//B写的代码 B写代码比较粗心,忘记处理异常int B_MyDivide(int a, int b){ int ba = a; int bb = b; int ret = A_MyDivide(ba, bb) +...原创 2019-10-09 14:05:39 · 359 阅读 · 0 评论 -
62 C++ - 异常基本概念
Bjarne Stroustrup说:提供异常的基本目的就是为了处理上面的问题。基本思想是:让一个函数在发现了自己无法处理的错误时抛出(throw)一个异常,然后它的(直接或者间接)调用者能够处理这个问题。也就是《C++ primer》中说的:将问题检测和问题处理相分离。一种思想:在所有支持异常处理的编程语言中(例如java),要认识到的一个思想:在异常处理过程中,由问题检测代码可以抛出一个对象...原创 2019-10-09 14:01:29 · 630 阅读 · 0 评论 -
60 C++ - 类模板的应用
设计一个数组模板类(MyArray),完成对不同类型元素的管理#pragma oncetemplate<class T>class MyArray{public: explicit MyArray(int capacity) { this->m_Capacity = capacity; this->m_Size = 0; // 如果T是对象,那么这...原创 2019-10-09 13:52:37 · 558 阅读 · 0 评论 -
59 C++ - 类模板
1. 类模板基本概念类模板和函数模板的定义和使用类似,我们已经进行了介绍。有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同。类模板用于实现类所需数据的类型参数化template<class NameType, class AgeType>class Person{public: Person(NameType name, AgeType age) { thi...原创 2019-10-09 13:49:26 · 485 阅读 · 0 评论 -
58 C++ - 模板机制剖析
1.编译过程hello.cpp程序是高级c语言程序,这种程序易于被人读懂。为了在系统上运行hello.c程序,每一条c语句都必须转化为低级的机器指令。然后将这些机器指令打包成可执行目标文件格式,并以二进制形式存储于磁盘中。预处理(Pre-processing) -> 编译(Compiling) ->汇编(Assembling) -> 链接(Linking)2. 模板实现机...原创 2019-10-09 13:43:50 · 538 阅读 · 0 评论 -
57 C++ - 函数模板
1. 什么是函数模板?//交换int数据void SwapInt(int& a,int& b){ int temp = a; a = b; b = temp;}//交换char数据void SwapChar(char& a,char& b){ char temp = a; a = b; b = temp;}//问题:如果我要交换doubl...原创 2019-10-09 11:17:48 · 337 阅读 · 0 评论 -
56 C++ - 模板概论
c++提供了函数模板(function template.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用函数就成为函数模板。凡是函数体相同的函数都可以用这个模板代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能。c++提供两种模板机制:函数模板和类模板类属...原创 2019-10-09 11:14:16 · 310 阅读 · 0 评论 -
55 C++ - 指向类成员的指针
1. 指向成员变量的指针定义格式:<数据类型> <类名>::*<指针名> 例如: int A::*pPram;赋值/初始化: <数据类型> <类名>::*<指针名> = &<类名>::<非静态数据成员> 例如: int A::*pParam = &A::param;...原创 2019-10-09 10:28:16 · 567 阅读 · 0 评论 -
54 C++ - 重写 重载 重定义
重载,同一作用域的同名函数同一个作用域参数个数,参数顺序,参数类型不同和函数返回值,没有关系const也可以作为重载条件 //do(const Teacher& t){} do(Teacher& t)重定义(隐藏)有继承子类(派生类)重新定义父类(基类)的同名成员(非virtual函数)重写(覆盖)有继承子类(派生类)重写父类(基类)的virtua...原创 2019-10-09 10:23:51 · 538 阅读 · 0 评论 -
53 C++ - 虚析构函数
1.虚析构函数作用虚析构函数是为了解决基类的指针指向派生类对象,并用基类的指针删除派生类对象。class People{public: People(){ cout << "构造函数 People!" << endl; } virtual void showName() = 0; virtual ~People(){ cout << "析构...原创 2019-10-09 10:22:15 · 314 阅读 · 0 评论 -
52 C++ - 纯虚函数和多继承
多继承带来了一些争议,但是接口继承可以说一种毫无争议的运用了。绝大数面向对象语言都不支持多继承,但是绝大数面向对象对象语言都支持接口的概念,c++中没有接口的概念,但是可以通过纯虚函数实现接口。 接口类中只有函数原型定义,没有任何数据定义。多重继承接口不会带来二义性和复杂性问题。接口类只是一个功能声明,并不是功能实现,子类需要根据功能说明定义功能实现。注意:除了析构函数外,其他声明都是纯...原创 2019-10-09 10:19:50 · 650 阅读 · 0 评论
分享