06 2020 档案

摘要:转自dancingrain判断链表中是否有环 有关单链表中环的问题 首先,关于单链表中的环,一般涉及到一下问题: 1.给一个单链表,判断其中是否有环的存在; 2.如果存在环,找出环的入口点; 3.如果存在环,求出环上节点的个数; 4.如果存在环,求出链表的长度; 5.如果存在环,求出环上距离任意一个 阅读全文
posted @ 2020-06-28 10:17 Chen沉尘 阅读(1284) 评论(0) 推荐(0)
摘要:对比 相同点:都是防止头文件重复包含 区别: 原理不一样,#pragma once如果发现头文件被包含就不会打开头文件,而后者每次都要打开头文件去判断头文件宏,所以前者更快; 缺陷: 当#pragma once用在两个内容相同,文件名不同的头文件中时,这2个头文件都会包含进来,编译时就会出现重定义的 阅读全文
posted @ 2020-06-27 20:36 Chen沉尘 阅读(216) 评论(0) 推荐(0)
摘要:转自The Charm Of Craftsmanship C++ 面向对象的三大特性和五个原则 三大特性 封装:就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代 阅读全文
posted @ 2020-06-27 20:21 Chen沉尘 阅读(1721) 评论(0) 推荐(0)
摘要:转自xd_xumaomao const(常量)和#define(宏定义)区别 对比 编译器处理不同 宏定义是一个“编译时”概念,在预处理阶段展开(在编译时把所有用到宏定义值的地方用宏定义常量替换),不能对宏定义进行调试,生命周期结束于编译时期;const常量是一个“运行时”概念,在程序运行使用,类似 阅读全文
posted @ 2020-06-27 18:08 Chen沉尘 阅读(657) 评论(0) 推荐(0)
摘要:STL概况 面试题 STL常用的容器有哪些以及各自的特点是什么? 1.vector:底层数据结构为数组 ,支持快速随机访问。 2.list:底层数据结构为双向链表,支持快速增删。 3.deque:底层数据结构为一个中央控制器和多个缓冲区,支持首尾(中间不能)快速增删,也支持随机访问。 4.stack 阅读全文
posted @ 2020-06-27 17:34 Chen沉尘 阅读(336) 评论(0) 推荐(0)
摘要:static作用 static的作用主要体现在两个方面: 作用域 生存期 静态局部变量 作用域:函数内部。 生存期:整个程序运行期间。 1 void fun() 2 { 3 static int i = 1; 4 } 静态全局变量 作用域:本文件内部。 生存期:整个程序运行期间。 static in 阅读全文
posted @ 2020-06-27 16:42 Chen沉尘 阅读(445) 评论(0) 推荐(0)
摘要:转自humeApz磁盘调度算法——FCFS、SSTF、SCAN、CSCAN 为了减少对文件的访问时间,应采用一种最佳的磁盘调度算法,以使各进程对磁盘的平均访问时间最少。由于在访问磁盘时主要是寻道时间。因此,磁盘调度的目标是使磁盘的平均寻道时间最少。 如磁道请求队列为55、58、39、18、90、16 阅读全文
posted @ 2020-06-23 09:05 Chen沉尘 阅读(13584) 评论(0) 推荐(4)
摘要:转自yhjokerVisual Studio中头文件stdafx.h的作用 在 Visual Studio 中(笔者版本 Visual Studio 2017),新生成的C++项目文件的的头文件夹下会默认有头文件stdafx.h,而源文件夹下则默认有源文件stdafx.cpp,手动将这些文件删除后, 阅读全文
posted @ 2020-06-19 12:44 Chen沉尘 阅读(1922) 评论(0) 推荐(0)
摘要:转自alice4C++中指针和引用的区别比较 指针 指针是编程语言中的一个对象,它的值是一个地址直接指向内存中另一个地方。 引用 引用就是某一变量(对象)的一个别名,对引用的操作与对变量直接操作完全一样。 指针和引用的区别 1.指针是一个实体,而引用仅是个别名; 2.引用必须被初始化且必须从一而终( 阅读全文
posted @ 2020-06-12 09:08 Chen沉尘 阅读(282) 评论(0) 推荐(0)
摘要:基础 C++的类支持三种member function:static,nonstatic,virtual。 nonstatic member function 编译器会将nonstatic member function转换为普通外部函数。 1 #include <iostream> 2 3 usi 阅读全文
posted @ 2020-06-11 13:05 Chen沉尘 阅读(293) 评论(0) 推荐(0)
摘要:基础 数据成员分类 static data members 编译器把static data members放在类的对象之外,即将唯一的实体在程序数据区中,当两个类中的static data members同名时,编译器会推导出独一无二的名字。 我们可以通过对象、指针、和类都可以取得static da 阅读全文
posted @ 2020-06-11 10:24 Chen沉尘 阅读(461) 评论(0) 推荐(0)
摘要:前言 对于传统结构化语言,如C语言,虽然编译器在背后也做了一下事情,但是很好理解。如编译器堆栈建立、参数排列、返回地址、堆栈清楚等。而对于面向对象的语言,编译器背着我们做了太多,如构造函数、析构函数、虚函数、继承、多态、合成额外函数、扩张我们函数的内容等。 不同的对象模型会有不同的执行效率,因为编译 阅读全文
posted @ 2020-06-10 22:44 Chen沉尘 阅读(428) 评论(0) 推荐(0)
摘要:转自princetengC++多线程——读写锁shared_lock/shared_mutex 何为读写锁 相比互斥锁,读写锁允许更高的并行性,互斥量要么锁住状态要么不加锁,而且一次只有一个线程可以加锁。读写锁可以有三种状态: 读模式加锁状态; 写模式加锁状态; 不加锁状态; 只有一个线程可以占有写 阅读全文
posted @ 2020-06-08 15:29 Chen沉尘 阅读(15851) 评论(0) 推荐(0)
摘要:需要保护的初始化举例 如对单例模式的初始化。 1 #include <iostream> 2 #include <thread> 3 #include <mutex> 4 5 using namespace std; 6 7 //单例模式 8 class MySingleTon{ 9 public: 阅读全文
posted @ 2020-06-08 14:22 Chen沉尘 阅读(461) 评论(0) 推荐(0)
摘要:保护共享数据的最基本的方式,是使用C++标准库提供的互斥量(头文件<mutex>)。当访问共享数据前,使用互斥量将相关数据锁住,再当访问结束后,再将数据解锁。线程库需要保证,当一个线程使用特定互斥量锁住共享数据时,其他的线程想要访问锁住的数据,都必须等到之前那个线程对数据进行解锁后,才能进行访问。这 阅读全文
posted @ 2020-06-08 12:54 Chen沉尘 阅读(1000) 评论(0) 推荐(0)
摘要:lock_guard<T> 使用的RAII机制,互斥量在lock_guard<T>对象构造时lock,在其析构时unlock。主要是为了解决在手动lock和unlock时忘记unlock的情况。lock_guard类不可复制,因为一个对象只能关联一个mutex。 锁的粒度 锁的粒度用来描述通过一个锁 阅读全文
posted @ 2020-06-07 22:25 Chen沉尘 阅读(545) 评论(0) 推荐(0)
摘要:C++标准库中有很多资源占有(resource-owning)类型,比如 std::ifstream , std::unique_ptr 还有 std::thread 都是可移动(movable),但不可拷贝(cpoyable)。虽然, std::thread 实例不会如 std::unique_p 阅读全文
posted @ 2020-06-07 11:44 Chen沉尘 阅读(798) 评论(0) 推荐(0)
摘要:转自绿色冰点C++11 std::ref使用场景 C++本身有引用(&),为什么C++11又引入了std::ref(或者std::cref)?使用std::ref可以在模板传参的时候传入引用,否则只能传值。主要是考虑函数式编程(如std::bind)在使用时,是对参数直接拷贝,而不是引用。如下例子: 阅读全文
posted @ 2020-06-07 11:11 Chen沉尘 阅读(1977) 评论(0) 推荐(0)
摘要:线程可以共享进程的内存空间,线程拥有自己独立内存。 关于参数的传递,std::thread的构造函数只会单纯的复制传入的变量,特别需要注意的是传递引用时,传入的是值的副本,也就是说子线程中的修改影响不了主线程中的值。 值传递 主线程中的值,被拷贝一份传到了子线程中。 1 #include <iost 阅读全文
posted @ 2020-06-07 10:54 Chen沉尘 阅读(12469) 评论(3) 推荐(1)
摘要:基础 detach()的作用是将子线程和主线程的关联分离,也就是说detach()后子线程在后台独立继续运行,主线程无法再取得子线程的控制权,即使主线程结束,子线程未执行也不会结束。当主线程结束时,由运行时库负责清理与子线程相关的资源。实际应用如让一个文字处理应用同时编辑多个文档,让每个文档处理窗口 阅读全文
posted @ 2020-06-07 10:49 Chen沉尘 阅读(18865) 评论(1) 推荐(1)
摘要:基础 join()函数的作用是让主线程的等待该子线程完成,然后主线程再继续执行。这种情况下,子线程可以安全的访问主线程中的资源。子线程结束后由主线程负责回收子线程资源。一个子线程只能调用join()和detach()中的一个,且只允许调用一次。可以调用joinable()来判断是否可以成功调用joi 阅读全文
posted @ 2020-06-06 16:30 Chen沉尘 阅读(12865) 评论(0) 推荐(1)
摘要:创建线程 子线程在创建时启动。使用功能std::thread类创建线程对象。 线程关联的可调对象可以是:普通函数、仿函数对象、Lambda表达式、非静态成员函数、静态成员函数。 示例 普通函数 1 #include <thread> 2 #include <iostream> 3 4 using n 阅读全文
posted @ 2020-06-06 11:29 Chen沉尘 阅读(6036) 评论(0) 推荐(0)
摘要:C 标准库的assert.h头文件提供了一个名为assert的宏,它可用于验证程序做出的假设,并在假设为假时输出诊断消息。assert 的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向 stderr 打印一条出错信息,然后通过调用 abort 来终止程序运行。 ass 阅读全文
posted @ 2020-06-04 15:21 Chen沉尘 阅读(533) 评论(0) 推荐(0)
摘要:存储器管理的主要对象是内存,由于对外存的管理与对内存的管理相类似,只是它们的用途不同,即外存主要用来存放文件。 存储器的层次结构 对于通用计算机而言,存储层次至少应具有三级:最高层为CPU寄存器,中间为主存,最底层是辅存。可以细划为寄存器、高速缓存、主存储器、磁盘缓存、固定磁盘、可移动存储介质等6 阅读全文
posted @ 2020-06-03 18:35 Chen沉尘 阅读(1765) 评论(0) 推荐(0)
摘要:explicit作用 阻止类构造函数的隐式自动转换。 由于C++的构造函数是默认支持隐式转换的(即默认是关键字implicit修饰)。 explicit使用场景 修饰只含一个参数的构造函数; 修饰除了第一个参数外其余参数都有默认值的构造函数。 当在上面两种情况以外的构造函数前加explicit时,e 阅读全文
posted @ 2020-06-01 20:18 Chen沉尘 阅读(156) 评论(0) 推荐(0)
摘要:RAII是什么 RAII全称是“Resource Acquisition is Initialization”,即资源获取即初始化。RAII技术被认为是C++中管理资源、避免泄露的最佳方法,可以实现安全、简洁的状态管理,编写出优雅的异常安全的代码。因为C++的语言机制保证了,当一个对象创建的时候,自 阅读全文
posted @ 2020-06-01 20:04 Chen沉尘 阅读(2113) 评论(0) 推荐(0)