降魔者
这个作者很懒,什么都没留下…
展开
-
第四十九节 C++ STL 自适应容器 - 栈和队列 stack queue
栈和队列跟其他容器类似,但栈和队列受一定的限制。stack:1 后进先出,只能从栈顶插入和删除数据2 头文件 #include <stack>queue:1 先进先出,从队尾插入元素,从队首删除元素2 #include <queue>priority_queue:1 #include <queue>2 可使用谓词,改变规则#include <iostrea...原创 2018-05-01 18:12:51 · 406 阅读 · 0 评论 -
第四十八节 C++ STL 算法
STL算法:1 头文件 #include <algorithm>2 算法通常与迭代器和函数对象一起使用仅举几个例子。#include <iostream>#include <vector>#include <string>#include <algorithm>using namespace std;/*1 函数模板:为了打...原创 2018-05-01 17:33:02 · 288 阅读 · 0 评论 -
第四十七节 C++ 匿名函数对象 - lambda 表达式
函数对象:函数的对象, 实现operator(), 常用于算法中。详见上一节函数对象的讲解lambda表达式属于函数对象,但其是匿名的。分为:1 一元函数的lambda表达式(不使用捕获列表,使用捕获列表)2 一元谓词的lambda表达式 (不使用捕获列表,使用捕获列表)3 二元函数的lambda表达式(不使用捕获列表,使用捕获列表)4 二元谓词的lambda表达式 (不使用捕获列表,使用捕获列表...原创 2018-05-01 15:50:29 · 2317 阅读 · 1 评论 -
第四十六节 C++ 函数对象 -用于STL的算法中
函数对象: 常用于标准模板库STL的算法1. 定义上为函数的对象;2. 实现上是实现了operator()的类的对象;常用的函数对象可分为多种:1 一元函数:输入为1个参数2 二元函数:输入为2个参数3 带变量的一元函数:输入为1个参数,且类内有属性成员4 带变量的二元函数:输入为2个参数,且类内有属性成员5 一元谓词:输入为1个参数,返回值为bool变量6 一元谓词:输入为5个参数,返回值为bo...原创 2018-05-01 14:27:52 · 290 阅读 · 0 评论 -
第四十五节 C++ STL(标准模板库)-映射类std::map std::multimap std::unordered_map std::unordered_multimap
map的操作与set类似,操作可参考上一节,这里仅介绍基本操作映射类: 为key-value(键-值)对容器, 支持根据key查找value, 如根据int可查找对应的stringstd::map: 存储唯一的键, 默认从小到大排序std::mulitmap: 可存储重复的键 , 默认从小到大排序 std::unordered_map: 用散列函数排序,键唯一 std::unordered_mul...原创 2018-05-01 12:10:20 · 922 阅读 · 0 评论 -
第四十四节 C++ STL(标准模板库)-集合类std::set std::multiset std::unordered_set std::unordered_multiset
集合用途:用于频繁而快速的搜索,存入集合的内容会进行排序,所以查找速度快,复杂度为对数std::set:存储的元素唯一, 不重复,默认我从小到大的排序std::multiset:存储的元素可重复,默认我从小到大的排序std::unordered_set:散列集合,使用散列函数计算唯一索引,并根据索引决定将元素放入哪个bucket(桶),#include <iostream> #...原创 2018-04-30 22:55:12 · 748 阅读 · 0 评论 -
第四十三节 C++ STL(标准模板库)- list(双向链表)和 forward_list(单向链表)
std::list 双向链表:1 头文件 #include <list>2 list是一系列节点,每个节点指向前一个节点和下一个节点3 插入元素的时间固定,不管在list的开头,中间,还是结尾4 含有多个重载构造函数,故存在多种具体化对象的方式std::forward_list 单向链表1 头文件 #include <forward_list>2 只允许沿一个方向遍历,智能...原创 2018-04-30 16:18:47 · 1066 阅读 · 0 评论 -
第四十二节 C++ STL(标准模板库)- 动态数组类 vector 和 deque
STL vector是模板类(它是一个模板,使用方法跟模板类似),具有:1. 数组大小是动态可变的2. 在末尾插入数据的时间的固定的,跟数组的大小没关系3. 在数组中间添加或删除元素所需要的时间,跟该元素后面的元素个数成正比4. 头文件 #include <vector>5. 在数组末尾添加元素:用成员方法push_back()6. 在数组末尾删除元素:用成员方法pop_back()7...原创 2018-04-30 10:41:40 · 420 阅读 · 0 评论 -
第四十一节 C++ STL(标准模板库)- string 类
string类是STL(标准模板库)向程序员提供了用于字符串处理的操作的容器类string。1 string可根据存储的内容,动态调整大小2 string类提供了其他的辅助函数(算法/方法),复制,链接,截短,查找字符或字符串,反转,大小写转换,删除等3 头文件<string>4 string提供了多个重载构造函数,因此在可以用多种方式构造string对象代码分三部分: 1 实例化对象...原创 2018-04-29 13:46:13 · 420 阅读 · 0 评论 -
第四十节 C++ 宏和模板详解
宏定义是在预编译时,将宏在引用出展开,所以使用宏定义时,一定要结合小阔号一起使用。宏的用法: 1 使用宏定义常量: #define NAME_NUM 60; #define NAME "tom" ; 2 使用宏定义函数(注意结合括号) 3 使用宏避免多次包含头文件 #ifndef _HUMAN_H_#...原创 2018-04-25 21:58:04 · 1096 阅读 · 0 评论 -
第三十九节 C++ 类型转换运算符 static_cast, dynamic_cast, reinterpret_cast, const_cast
C++类型转换运算符:static_cast, dynamic_cast, reinterpret_cast, const_cast使用格式: dest_type result = cast_type<dest_type> (objest_to_be_casted)static_cast: 用途1: 在继承中,在编译阶段检查转换类型是否相关,若不相关,编译失败,可用于继承类的向上转换...原创 2018-04-16 19:03:53 · 374 阅读 · 0 评论 -
第三十八节 C++ 运算符重载 - 双目运算符
#include <iostream>using namespace std;/* 运算符重载 -- 双目运算符 a+b, a+=b, a==b, a<b... * 格式: * 1 全局函数或静态成员函数: return_type operator symbol(param1,param2 * 2 类成员: return_type operator symbol(...原创 2018-04-16 17:00:55 · 2928 阅读 · 0 评论 -
第三十七节 C++ 运算符重载 - 单目运算符
#include <iostream>using namespace std;/*运算符重载 -- 单目运算符 ++, --, *, -> 格式: return_type operator symbol(params list...) */class Base {private: unsigned int numBase;public: /*operat...原创 2018-04-16 16:35:15 · 603 阅读 · 0 评论 -
第三十六节 C++ 菱形问题的解决 -- 虚继承
菱形问题:三个派生类同时继承一个基类,又存在另一个派生类同时继承这三个派生类。这将导致创建三个基类对象(calss One),当我们通过Three去调用One的函数实现时, 将出现错误,编译器不知道调用哪个One的函数,这将是我们不愿意发生的。#include <iostream>using namespace std;class One {public: One() { c...原创 2018-04-16 13:18:59 · 1643 阅读 · 0 评论 -
第三十五节 C++ 抽象基类和纯虚函数
#include <iostream>using namespace std;/* 抽象基类:不能被实例化的基类。 它仅仅只有一个用途,用来派生出其他类。 * 1. 要定义抽象基类,可使用纯虚函数,纯虚函数可当做接口使用 * 2. 基类的纯虚函数,在派生类中必须实现。 虚函数可以不用必须实现 *//*定义抽象基类*/class BaseClass {public:...原创 2018-04-16 13:07:30 · 558 阅读 · 2 评论 -
第三十四节 C++ 多态原理与虚函数表
多态: 将派生类对象视为基类对象,执行派生类对象的操作, 可用virtual实现多态。下面代码存在两个问题:#include <iostream>using namespace std;/* 这段代码将存在两个严重问题: * 1. 当在函数VerityWhitchClass()传入一个对象时,我们希望它执行被传入对象的方法,但这里执行了基类的方法 * 2. 当delete传入...原创 2018-04-13 17:11:04 · 232 阅读 · 0 评论 -
第三十三节 C++ 继承之对象的构造顺序与析构顺序
#include <iostream>using namespace std;/*对象的构造顺序:* 1:没有继承关系时: 先属性后构造(构造函数)* 2:有继承关系时: 先基类后子类,先属性后构造(构造函数)* 3 : 对象析构与构造循序正好相反 *///定义class Member:为了检验类属性和构造函数的先后顺序class MemberPerson {pu...原创 2018-04-08 18:52:26 · 329 阅读 · 0 评论 -
第三十二节 C++ 继承之基类的成员函数在派生类中被隐藏
#include <iostream>using namespace std;/*假设基类中函数被重载,当派生类覆盖基类的成员函数时,会隐藏到基类的其他的重载函数* 注:应该尽量避免隐藏基类的成员函数*/class Person {protected: //只能在派生类内部访问protected成员,外部不可访问 bool man;public: // public权...原创 2018-04-08 18:42:46 · 1984 阅读 · 0 评论 -
第三十一节 C++ 继承之如何在派生类中调用基类被覆盖的函数成员(方法)
#include <iostream>using namespace std;/*有些基类的方法在派生类被覆盖,但有时我们需要调用基类的方法。* 这里提供了两种方式去调用基类被覆盖的方法(均使用作用域解析运算符::)。* 1: 直接在派生类中调用被覆盖的基类方法,如 Person::CheckPerson() ;* 2: 使用派生类对象调用被覆盖的基类方法,如 Tom.P...原创 2018-04-08 18:21:55 · 6323 阅读 · 2 评论 -
第三十节 C++ 继承之覆盖基类的成员函数(方法)
#include <iostream>using namespace std;/*在派生类中可以覆盖基类的方法,(调用派生类对象时,只运行派生类实现的函数,而不运行基类实现的函数)* 只要在派生类中重新命名一个跟基类成员函数一样的名字及参数就可以覆盖基类方法**/class Person {protected: //只能在派生类内部访问protected成员,外部不可访...原创 2018-04-08 18:12:01 · 2066 阅读 · 0 评论 -
第二十九节 C++ 继承之向基类传递参数
#include <iostream>using namespace std;/*有时,基类存在重载的构造函数,而搞造函数对类的数据成员进行了初始化,* 这种情况下,在继承基类时,需要对基类的数据成员进行初始化 **/class Person {protected: //只能在派生类内部访问protected成员,外部不可访问 bool man;public: //...原创 2018-04-08 17:40:53 · 3114 阅读 · 0 评论 -
第二十八节 C++ 继承之基础
#include <iostream>using namespace std;/*类的继承: 派生类,可根据访问限定符(public,private,protected)访问基类的属性和方法* 使用继承的方式,可以抽象多个对象公共部分,并复用代码*/class Person {public: //1: public权限,可被派生类访问 bool man; void C...原创 2018-04-08 17:15:51 · 177 阅读 · 0 评论 -
第二十七节 C++ 友元类与友元函数
/* Human.h */#include <string> /* class定义的private数据成员和方法,不能被外部访问,但可以被友元函数和友元类访问 * 友元函数:在类中使用friend可将函数声明为友元函数,友元类可访问类的私有数据和方法 * 友元类:在类中使用friend可将另一个声明为友元类,友元类可访问类的私有数据和方法 */class Hum...原创 2018-04-06 20:52:19 · 275 阅读 · 0 评论 -
第二十六节 class 与 struct的默认权限区别
/* class和struct最大的区别:默认权限不同 * class:成员的默认权限是private * struct:成员默认权限为public, 继承也默认为public继承*/class Human { char* name; //默认为private成员 int age; Human(const char* initString); //默认为private成员 ...原创 2018-04-06 20:17:57 · 3479 阅读 · 0 评论 -
第二十五节 C++ 类和对象的关键字sizeof()
/* Human.h */#include <string> /** 类的大小取决于类的数据成员大小,函数成员和函数成员的局部变量不占空间*/class Human{private: char* name; //指针占4个字节 int age; //int占4个字节 bool man; //占一个字节,但这里会按照4个字节填充public: Huma...原创 2018-04-06 20:00:28 · 268 阅读 · 0 评论 -
第二十四节 C++ this关键字
/* Human.h */#include <string> /* * this指当前对象的地址 */class Human{private: char* name; public: Human(const char* initString); //变量若不允许函数修改,最好定义成const变量 ~Human(); void getObjNam...原创 2018-04-06 18:01:42 · 245 阅读 · 0 评论 -
第二十三节 C++ 如何禁止在栈中实例化类
有时需要在堆中创建对象,禁止在栈中去创建,1 可以将析构函数定义为private成员2 建立static函数成员去delete这个堆空间/* Human.h */#include <string> /* * 为了禁止某些类在栈中创建,措施之一是将析构函数定义为private * 这样在函数使用完对象,并对其销毁时将出现错误,因为不能在外部调用析构函数 * 这种方式,堆内...原创 2018-04-06 16:05:39 · 920 阅读 · 0 评论 -
第二十二节 C++ private,static和构造函数实现单例模式
/* Human.h */#include <string> /*这里使用了static关键字:* static用于类的数据成员时,该数据成员在所有对象之间共享* static用于在函数内部声明局部变量时,该变量的值两次调用之间,值不变* static用于成员函数时,该函数在所有成员之间共享*//*构造函数,复制构造函数,赋值操作符,都声明为private成员,保证...原创 2018-04-06 14:06:15 · 1348 阅读 · 0 评论 -
第二十一节 C++ - 复制构造函数(浅复制,深复制)
例子1: 不带指针成员的类,此例子,为了看是否产生临时对象(浅复制,按值传递)#include <string>/*此类中没有指针成员*/class Human{private: std::string name;/*public类外可访问*/public: void getPersonName(); Human(std::string input); ~Hum...原创 2018-03-28 18:01:12 · 270 阅读 · 0 评论 -
第二十节 C++- 析构函数的使用及调用
析构函数是类的一种特殊函数,只有在对象被销毁时才被调用,在析构函数内,可以对堆内存进行释放,如new(构造函数),delete(析构函数)。构造函数可以有多个(重载),而析构函数只有一个(不能对析构函数进行重载)。如果忘记实现析构函数,编译器会自动生成一个伪析构函数(空函数),从下面代码,可以看出析构函数的使用及调用顺序。/*Human.h*/#include <string>c...原创 2018-03-28 17:13:42 · 9618 阅读 · 1 评论 -
第十九节 C++ - 带初始化列表的构造函数
/* Human.h */#include <string>class Human {private: std::string name; unsigned int age;public: /*构造函数与类同名,在创建对象时被调用,当没有定义构造函数时,系统将调用一个默认的构造函数 * 析构函数,在对象被销毁时调用 */ Human(std::string...原创 2018-03-27 22:49:59 · 471 阅读 · 0 评论 -
第十八节 C++ - 带默认参数值的构造函数
/* Human.h */#include <string>class Human {private: std::string name; unsigned int age;public: /*构造函数与类同名,在创建对象时被调用,当没有定义构造函数时,系统将调用一个默认的构造函数 * 析构函数,在对象被销毁时调用 */ Human(std::string...原创 2018-03-27 22:34:24 · 1233 阅读 · 0 评论 -
第十七节 C++ - 重载构造函数
/* Human.h */#include <string>class Human {private: std::string name; unsigned int age;public: /*构造函数与类同名,在创建对象时被调用,当没有定义构造函数时,系统将调用一个默认的构造函数 * 析构函数,在对象被销毁时调用 */ Human(); Human(s...原创 2018-03-27 22:08:34 · 2578 阅读 · 0 评论 -
第十六节 C++ -构造函数与析构函数基础
构造函数与其他类的函数不同,构造函数在创建对象时被调用,构造函数与类型相同,但没有返回值。/* Human.h */#include <string>class Human {private: std::string name; unsigned int age;public: /*构造函数与类同名,在创建对象时被调用,当没有定义构造函数时,系统将调用一个默认的...原创 2018-03-27 21:53:27 · 165 阅读 · 0 评论 -
第十五节 C++ -class类和对象简介
/* Human.h */#include <string>/*使用关键字class定义一个类,类只有被实例化后才能使用*/class Human {private: //私有权限,在对象之外无权限被访问 std::string name; //类的属性 unsigned int age;public: //公有权限,在对象外可以被访问,可看作对外的接口(类的外部...原创 2018-03-27 21:28:07 · 220 阅读 · 0 评论 -
第十四节 C++ - new和delete讲解
#include <iostream>#include <string>int main(){ /* 静态数组的使用存在两个问题: * 1: 限制了容量,容量大小不可调节 * 2: 降低了系统性能,当我仅存在一个数据时,其他99个空间将是被浪费的 */ int arrayNum[100] = {1, 2}; //静态内存分配,大小固定,使用过程中不可...原创 2018-03-25 22:15:56 · 416 阅读 · 0 评论 -
第十三节 C++ -指针详解
1 使用C++指针,最好进行先初始化或者初始化为NULL,避免野指针,若不进行初始化,指针将指向随机值2 使用指针(数组)要防止内存访问越界3 使用指针前,务必检查其是否为NULL,只有在指针有效时才使用指针#include <iostream>void paramPointerFun(int* params); //声明指针可传入的函数int main(){ int da...原创 2018-03-25 20:40:19 · 288 阅读 · 2 评论 -
第十二节 C++ - inline 内联函数
常规的函数调用,处理器会使用栈指针跳转到函数处去执行,其中会涉及到栈操作,及跳转操作,这样的操作很花费一点的时间(虽然时间很短),但对于只有几句语句的函数来说,这种时间开销是很不划算的,为了解决这个问题,编程语言中引入了inline关键字,可以用它来定义某个函数为inline函数,编译器将此类函数在被调用的地方展开,这样就提高了代码的执行速度,但是,inline函数也有其弊端,它会使代码量膨胀。#...原创 2018-03-25 18:56:17 · 204 阅读 · 0 评论 -
第十一节 C++ - 按引用传递参数给函数
引用相当于给变量起了另一个名字,但是他们指的是同一个变量,对任何一个名字进行处理,都是对同一个地址进行操作。通过在函数内外打印变量地址可以验证这一点。#include <iostream>void displayFun(int& value); //参数引用int main(){ int dateInt = 100; std::cout << "...原创 2018-03-25 18:39:25 · 447 阅读 · 0 评论 -
第十节 C++ - 将数组当参数传递给函数
不废话,直接上代码例子:#include <iostream>void displayArray(int Array[], int length); //与下面函数形成函数重载void displayArray(char Array[], int length);int main(){ int array_Int[] = {1, 2, 3, 4, 5}; char...原创 2018-03-25 18:06:45 · 438 阅读 · 0 评论