C++
文章平均质量分 77
爬比我。
这个作者很懒,什么都没留下…
展开
-
C++多线程
如何创建启动一个线程std::thread创建一个线程对象,传入线程所需要的的线程函数和参数,线程自动开始执行。void threadHandle1(){ //子线程等待两秒 std::this_thread::sleep_for(std::chrono::seconds(2)); cout << "hello thread1" << endl;}int main(){ //定义了一个线程对象 传入一个线程函数 新线程开始运行 std::thread原创 2021-01-27 22:46:52 · 119 阅读 · 0 评论 -
C++中的绑定器
STL中的绑定器bind1st: operator() 的第一个形参变量绑定成一个确定的值。bind2nd: operator() 的第二个形参变量绑定成一个确定的值。绑定器加二元函数对象得到一个一元函数对象int main(){ vector<int> vec; srand(time(nullptr)); for (int i = 0; i < 20; ++i) { vec.push_back(rand() % 100 + 1); } sort(ve原创 2021-01-05 22:55:20 · 247 阅读 · 0 评论 -
AVL树(二叉平衡搜索树)
如图的数虽然是树的结构,但它相当于链表,查询效率为O{n},效率没有树的效率高,所以要对其进行改进就引入了AVL树。AVL树是为了维护节点平衡引入的四种节点旋转操作:节点失衡的原因是由于:左孩子左子树太高了。(右旋转) node和child节点的高度值都需要更新。child=node->left; node->left=child->right; child->right=node;右孩子的右子树太高了(左旋)。左孩子的右子树太高了。(左右旋转......原创 2020-09-01 21:18:03 · 1656 阅读 · 0 评论 -
二叉搜索树(BST)
BST树称作二叉搜索树(Binary Search Tree)或者二叉排序树(Binary Sort Tree) ,它或者是一颗空树;或者是具有下列性质的二叉树:若左子树不为空,则左子树上所有节点的值均小于它的根节点的值 若右子树不为空,则右子树上所有节点的值均大于它的根节点的值 左右子树也分别满足二叉搜索树性质特点:每一个节点都满足左孩子的值 (不为空) < 父节点的值<右孩子的值(不为空)。二分查找就是利用了bst树的性质。......原创 2020-08-19 12:51:31 · 1915 阅读 · 0 评论 -
STL heap
Heap堆是常用的数据结构,Heap中也可以存放元素。但是STL中并没有提供Heap容器,只是提供了关于Heap操作的算法。只要支持RandomAccessIterator的容器都可以作为Heap容器。Heap分为max heap和min heap,max heap中每次取出的结点时heap结构中值最大的结点,min heap中每次取出的结点时heap结构中值最小的结点。Heap不允许遍历其结点,所以Heap没有迭代器。在实际应用中,经常用vector作为heap容器,heap经常作为prior原创 2020-08-19 11:31:42 · 1276 阅读 · 0 评论 -
queue
queue简介queue是队列容器,是一种“先进先出”的容器。 queue是简单地装饰deque容器而成为另外的一种容器。 queue没有迭代器,不允许遍历。queue采用模板类实现,queue对象的默认构造形式:queue<T> queT; 如:queue<int> queInt; //一个存放int的queue容器。queue<float> queFloat; //一个存放float的queue容器。queue&l...原创 2020-08-18 17:07:04 · 664 阅读 · 0 评论 -
stack
stack是一种先进后出的数据结构。stack除了最顶端元素外,没有其他办法去读取其他元素,因此stack不存在遍历行为。所以stack没有迭代器。stack容器适配器的创建由于 stack 适配器以模板类 stack<T,Container=deque>(其中 T 为存储元素的类型,Container 表示底层容器的类型)的形式位于头文件中,并定义在 std 命名空间里。stack<int> values;上面这行代码,就成功创建了一个可存储 int 类型元素原创 2020-08-18 16:54:27 · 1996 阅读 · 0 评论 -
list
list是C++标准模版库(STL,Standard Template Library)中的部分内容。实际上,list容器就是一个双向链表,可以高效地进行插入删除元素。list的迭代器list不能在够想vector一样以普通指针作为迭代器,因为其节点不保证在储存空间连续存在。list迭代器必须有能力指向list节点点,并有能力进行递增、递减、取值、成员存取等操作。list插入和接合操作都不会造成原有的迭代器失效。list的数据结构list不仅仅是一个双向链表,而且是一个环状双向链表。所以它只原创 2020-08-17 18:17:08 · 1348 阅读 · 0 评论 -
deque用法及实现
所谓的deque是”double ended queue”的缩写,双端队列不论在尾部或头部插入元素,都十分迅速。而在中间插入元素则会比较费时,因为必须移动中间其他的元素。双端队列是一种随机访问的数据类型,提供了在序列两端快速插入和删除操作的功能,它可以在需要的时候改变自身大小,完成了标准的C++数据结构中队列的所有功能。Vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间。deque对象在队列的两端放置元素和删除元素是高效的,而向量vector只是在插入序列的末尾时操作才是高.原创 2020-08-17 14:32:02 · 6834 阅读 · 1 评论 -
vector的实现及总结
vector:vector的数据安排以及操作方式与array非常类似。两者唯一的差别就是在于空间的运用灵活性,array是静态空间,一旦分配了就是固定的,无法改变其大小。需要用户重新申请更大的空间,移动数据,释放原来的空间。而vector是动态空间,有其内部的空间分配机制来及时调整空间大小,其实就是vector把申请空间,移动数据,释放原来的空间等操作封装在内部,不需要用户去处理。接下来我们自己实现一下vector,并给其加上空间配置器。// 简单的vector容器实现,主要查看其嵌套类ite原创 2020-08-17 14:00:13 · 3707 阅读 · 0 评论 -
迭代器iterators
迭代器iterator是C++ STL的六大组件之一,作用是用来遍历容器,而且是通用的遍历容器元素的方式,无论容器是基于什么数据结构实现的,尽管不同的数据结构,遍历元素的方式不一样,但是用迭代器遍历不同容器的代码是完全一样的。经典的迭代器遍历容器的代码如下:vector<int>::iterator it = vec.begin();for (; it != vec.end(); ++it){ cout << *it << " ";}cout <&l原创 2020-07-16 21:07:02 · 814 阅读 · 0 评论 -
空间配置器allocator
空间配置器的作用是在底层为上层的各种容器提供存储空间,需要多少分配多少,一般分配的比你需要的更多。打个不恰当的比喻,空间配置器和容器之间的关系,相当于将军和粮草的关系。当然了,容器相当于将军,它在阵前杀敌,冲锋陷阵,处理各种事情;而空间配置器就相当于粮草,给前阵提供源源不断的供给;如果一个将军想打胜仗,那必须后方粮草充足才行。为了进一步提高内存的使用率和使用效率。主要是从以下两方面来考虑的:1.小块内存会带来内存碎片问题如果任由STL中的容器自行通过malloc分配内存,那么频繁的分配和释放内存原创 2020-07-15 12:37:12 · 880 阅读 · 0 评论 -
STL
STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但这种分离确实使得STL变得非常通用。例如,由于原创 2020-07-15 11:23:04 · 672 阅读 · 0 评论 -
智能指针
智能指针是为了方便管理动态内存,防止产生内存泄漏,而对指针进行的一层封装,可以通过析构函数,构造函数,赋值运算符重载的处理,而实现的可以自动管理指针所指向的动态内存,防止产生内存泄漏。定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。智能指针:主要有Boost库中的智能指针和STL标准库中的智能指针构成。所有智能指针编写代码时都需要注意的事:智能指针编写的时候,因为不知道指向的是何种类型的堆内存,所以都写成模板形式 注原创 2020-07-09 20:11:32 · 764 阅读 · 0 评论 -
string类总结
目录string 对象的定义和初始化string 对象的操作string::size_type 类型插入(insert)替换(replace)添加(append)删除(erase)剪切(substr)比较(compare)交换(swap)反转(reverse)迭代器(iterator)查找(find)string 类型支持长度可变的字符串,C++ 标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作。标准库 string 类型的目的就是满足对字原创 2020-07-08 13:31:39 · 765 阅读 · 0 评论 -
C++类型转换运算符
目录dynamic_caststatic_castC语言的类型转换比较自由,但也带来了一些问题,这些问题大多由程序员自行控制和解决。对于庞大的C++语言机制而言,这种简单粗暴的类型转换方式显然是个巨大的负担,因此C++引入4种类型转换运算符,更加严格的限制允许的类型转换,使转换过程更加规范:dynamic_cast 用于多态类型的转换 static_cast 用于非多态类型的转换 const_cast 用于删除const ,volatile 和 __unaligned 属性...原创 2020-07-07 14:03:10 · 879 阅读 · 0 评论 -
友元函数、友元类
友元函数友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下:friend 类型 函数名(形式参数);友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。一个函数可以是多个类的友元函数,只需要在各个类中分别声明。友元函数的调用与一般函数的调用方式和原理一致。class Date{ //友元函数在类内部声明 f原创 2020-07-06 11:19:14 · 972 阅读 · 0 评论 -
实现string类
#include <iostream>#include <cstring>#include <iomanip> using namespace std; class MyString{public: MyString(const char *s=NULL); MyString(const MyString& rhs);...原创 2020-03-30 21:13:33 · 767 阅读 · 0 评论 -
C++模板
c++模板编程可以使你的程序更加的优雅和简介,在减少了代码量的优势下不说,运用得当也可以极高提高运行效率和开发效率。原创 2020-03-15 20:02:55 · 1117 阅读 · 0 评论 -
虚函数 虚函数表
虚函数是面向对象编程函数的一种特定形态,是C++用于实现多态的一种有效机制。C++的多态可以分为静态多态和动态多态。函数重载和运算符重载实现的多态属于静态多态,而通过虚函数可以实现动态多态。实现函数的动态联编其本质核心则是虚表指针与虚函数表。虚函数的本质就是通过基类访问派生类定义的函数。每一个含有虚函数的类,其实例对象内部都有一个虚函数表指针,该虚函数表指针被初始化为本类的虚函数表的内存地址。.........原创 2020-03-09 20:52:33 · 2875 阅读 · 0 评论 -
静态联编与动态联编
将源代码中的函数调用解释为执行特定的函数代码块被称为函数名联编。在c语言中,因为每个函数名都有对应一个不同的函数。在C++中,由于重载的缘故,编译器必须查看函数参数以及函数名才能确定使用的是哪个函数,然而睡佳佳编译器可以在编译过程中完成这种两边在编译过程中进行联编,被称为静态联编。虚函数是这项工作变得更加困难,使用哪一个函数不是是不能在编译的时候确定的,因为编译器不就多少用户将选择哪种类型的对......原创 2020-03-08 16:02:43 · 2913 阅读 · 0 评论 -
菱形继承
菱形继承就是两个子类继承同一个父类,而又有子类同时继承这两个子类。创建一个基类A让B1和B2公有继承于它,让C公有继承B1和B2。class A{public : A() :a(1) { cout << "A()" << endl; } ~A() { cout <&l...原创 2020-03-06 22:07:30 · 891 阅读 · 0 评论 -
类的继承
首先我们来看一下原创 2020-03-05 21:17:28 · 3748 阅读 · 0 评论 -
运算符重载
首先我们要知道普通的运算符+、-、*、/等,只能用于对基本类型的常量或变量进行运算,不能用于对象之间的运算。有时希望对象之间也能用这些运算符进行运算,以达到使程序更简洁、易懂的目的。运算符重载是一种C++多态。那么我们如果想将两个对象进行运算,我们该怎么办?C++ 提供的“运算符重载”机制,赋予运算符新的功能,就能解决用+将两个对象相加这样的问题。运算符重载,就是对已有的运算符赋予多重......原创 2020-02-28 21:33:54 · 2126 阅读 · 0 评论 -
构造函数的初始化列表
已经有个构造函数负责初始化,为什么还需要构造函数初始化表呢?在以下三种情况下需要使用初始化成员列表:需要初始化的数据成员是对象的情况; 需要初始化const修饰的类成员; 需要初始化引用成员数据;引用类型的成员变量必须在构造函数的初始化列表中进行初始化。对于类成员是const修饰,或是引用类型的情况,是不允许赋值操作的,(显然嘛,const就是防止被错误赋值的,引用类型必须定义赋值在......原创 2020-02-27 14:22:40 · 2900 阅读 · 1 评论 -
拷贝构造函数 浅拷贝 深拷贝
拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数常用于:通过使用另一个同类型的对象来初始化新创建的对象; 复制对象把它作为参数传递给函数; 复制对象,并从函数返回这个对象。那么拷贝构造函数...原创 2020-02-25 21:21:35 · 1625 阅读 · 0 评论 -
new与delete C++
首先我们来看一下new和delete。1)在C++中堆内存的分配和释放是通过new和delete来操作的,new的底层也是通过malloc来开辟内存的,new比malloc多一项功能,就是开辟完内存,还可以进行初始化操作,如下:int *p = new int(10);上面是new的基本操作,10代表堆上开辟的整形内存的初始值;如果是自定义类类型的话,如下:Test *p = ne...原创 2019-10-12 20:00:41 · 978 阅读 · 0 评论 -
this指针C++
什么是this指针?this指针是指向实例化对象本身时候的一个指针,里面存储的是对象本身的地址,通过该地址可以访问内部的成员函数和成员变量。举例来说:当你进入一个房子后,你可以看见桌子、椅子、地板等,但是房子你是看不到全貌了。对于一个类的实例来说,你可以看到它的成员函数、成员变量,但是实例本身呢?this是一个指针,它时时刻刻指向你这个实例本身。this指针只能在一个类的成员函数中调用,它表...原创 2019-06-02 20:27:48 · 980 阅读 · 0 评论