自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

织席贩履之辈

看家护院之徒

  • 博客(107)
  • 收藏
  • 关注

转载 c++ 互斥锁 条件变量 信号量 异步操作 原子操作

我们借助一道题来描述C++的这些线程同步机制这道题来源于leetcode 的 1114. 按序打印我们提供了一个类:public class Foo { public void first() { print("first"); } public void second() { print("second"); } public void third() { print("third"); }}三个不同的线程 A、B、C 将会共用一个 Foo 实例。一个将会调用 first()

2021-05-23 14:04:16 659 2

原创 算法面试常考内容收集

必须达到能手写下列问题对应代码的程度:在链表这一节:单链表反转;链表中环的检测;两个有序的链表合并;删除链表倒数第n个结点;求链表的中间结点等。在栈这一节:在函数调用中的应用;在表达式求值中的应用;在括号匹配中的应用。在排序这一节:如何在O(n)的时间复杂度内查找一个无序数组中的第 K大元素?在二分查找这一节,二分查找的四个变体。对于海量数据的处理思路问题比如说,我们有10GB的订单数据,我们希望按订单金额(假设金额都是正整数)进行排序,但是我

2021-03-10 15:57:53 207

原创 C++之CMake语法特性介绍 及 CMake实战演练

Preface在阅读这篇文章之前,建议先阅读另外一篇文章 基于VSCode的C++环境搭建及多文件编译、【G++编译器和GDB调试器】用法简介,尤其是第二篇如果不了解g++编译过程及相关参数、不了解gdb的调试特性及相关参数,那么我想对CMake语法的学习和理解也不可能太到位。进阶小试,可以阅读另外一篇文章:cmake:target_** 中的 PUBLIC,PRIVATE,INTERFACE另附vscode Linux环境下的launch.json、tasks.json配置文件,适配CMake的构

2021-02-22 18:42:08 469

原创 VSCode C++开发launch.json和tasks.json配置模板

launch.jsonlaunch.json只需要修改一处,即"program": "${workspaceFolder}/<executable path>"中的<executable path>需要改写的实际可执行二进制文件的路径(包含文件名),前面的${workspaceFolder}不需要改动。注意,launch.json要和tasks.json,所以launch.json文件中的"preLaunchTask": "Build"要和tasks.json中的"label"

2021-02-22 17:33:57 5964 2

转载 【G++编译器和GDB调试器】用法简介

GCC编译器一. 编译过程预处理-Pre-Processing //.i文件# -E 选项指示编译器仅对输入文件进行预处理g++ -E test.cpp -o test.i //.i文件编译-Compiling //.s 文件# -S 编译选项告诉 g++ 在为 C++ 代码产生了汇编语言文件后停止编译g++ 产生的汇编语言文件的缺省扩展名是 .sg++ -S test.i -o test.s汇编 Assembling //.o文件# -c 选项告

2021-02-20 18:27:04 872

原创 常见排序算法的性能对比

时间复杂度空间复杂度可否实现稳定性选择O(N2)O(N^2)O(N2)O(1)O(1)O(1)No冒泡O(N2)O(N^2)O(N2)O(1)O(1)O(1)Yes插入O(N2)O(N^2)O(N2)O(1)O(1)O(1)Yes归并O(Nlog⁡N)O(N\log N)O(NlogN)O(N)O(N)O(N)Yes快速O(Nlog⁡N)O(N\log N)O(NlogN)O(log⁡N)O(\log N)O(logN)No...

2021-02-01 12:37:48 256

转载 基于VSCode的C++环境搭建及多文件编译

声明:本文参考自b站《手把手教会VSCode的C++环境搭建,多文件编译,Cmake,json调试配置( Windows篇)》:< https://b23.tv/HiWjVl>更多精彩:《基于VSCode和CMake实现C/C++开发 | Linux篇》https://www.bilibili.com/video/BV1fy4y1b7TC总体认识vscode中有两个配置文件非常关键,launch.json、tasks.json,要想理解这两个文件的作用,首先需要理解一个C++是如何被

2021-01-24 10:25:00 440

转载 C++ const 和 constexpr 的区别?

constexpr 是 C++11 引入的,一方面是为了引入更多的编译时计算能力,另一方面也是解决 C++98 的 const 的双重语义问题。在 C 里面,const 很明确只有 「只读」 一个语义,不会混淆。C++ 在此基础上增加了 「常量」 语义,也由 const 关键字来承担,引出来一些奇怪的问题。C++11 把 「常量」 语义拆出来,交给新引入的 constexpr 关键字。演示一下 const 关键字的双重语义可能带来的的问题:template<int N> class C{

2020-11-19 12:10:53 472

原创 右值和右值引用与std::move()的内在联系是啥,完美转发与引用折叠为何如此难解,一篇博文让你彻底开悟

右值和右值引用与std::move()的内在联系是啥,完美转发与引用折叠为何如此难解,一篇文章让你彻底开悟std::move()是一个C++标准模板库的函数模板,它的作用是:输入一个左值对象,输出一个相应的无名右值引用,而无名右值引用本质上就是右值。上面是从宏观层面进行了理解,现在我的问题是,std::move()函数会对输入的左值对象产生哪些影响?会不会让这个左值对象立刻失效?这句代码执行完后,对刚刚输入的左值对象操作还有效吗?通常出现这些问题是因为根本没有理解std::move()函数的运行机制。

2020-10-27 22:25:39 157

原创 汇编语言初认识

目录1. 函数的内存布局2. 内存空间的布局3. CS(code segment)4. DEBUG指令第三章3.1 内存中字的存储3.2 DS和[address]3.3 字的传送3.4 mov, add, sub指令3.5 栈3.5.1 CPU提供的栈机制3.5.2 两个疑问3.6 栈顶越界的问题3.7 栈段4.2 源程序MOVS指令:移动数据 内存-内存STOS指令:将`AI/AX/EAX`的值存储到`[EDI]`指定的内存单元堆栈相关指令修改EIP的指令堆栈平衡1. 函数的内存布局要被执行的代码(

2020-09-24 09:04:14 469

原创 流类库与输入输出

I/O流的概念及流类库结构程序与外界环境的信息交换当程序与外界环境进行信息交换时,存在着两个对象:程序中的对象、文件对象。流是一种抽象,负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动。流对象与文件操作程序建立一个流对象指定这个流对象与某个文件对象建立连接程序操作流对象流对象通过文件系统对所连接的文件对象产生作用。提取与插入读操作在流数据抽象中被称为(从流中)提取写操作被称为(向流中)插入。流类库结构流类列表输出流概述最重要的三个输出流ostr

2020-09-10 20:36:17 295

原创 torch模型的保存与加载

两种方式''' 第一种方式 模型整体保存,占用空间会比较大'''torch.save(net, "../model/model.pkl")torch.load("")''' 第二种方式 保存模型参数,在加载模型参数之前,必须先建立模型'''torch.save(net.state_dict(), "params.pkl")net.load_state_dict()下面是整个流程的代码import torch# data 数据加载import nu

2020-08-29 08:39:17 1636

转载 Pycharm远程连接服务器显示图窗的解决方法&&使用Tensorboard查看远程服务器的训练情况

1. 配置远程服务器需要在远程服务器上安装好xorg;sudo apt install xorg之后在/etc/ssh/sshd_config中打开X11Forwarding;sudo vim /etc/ssh/sshd_config把X11Forwarding设置成yes,如上图,保存退出。重启远程服务器的ssh服务,使配置生效;sudo /etc/init.d/ssh restart这样服务器端就配置完了。2.配置自己的电脑同样需要安装xorgsudo apt install

2020-08-17 21:58:36 3576 1

原创 思腾合力<作业提交>及<连接各种服务>的说明

cd ~source environments/tf2_py3/bin/activatetensorboard --logdir=$TENSORBOARD_PATH --port=$PAI_CONTAINER_HOST_tensorboard_http_PORT_LIST >> tb.log &jupyter notebook --allow-root --no-browser --ip 0.0.0.0 --port=$PAI_CONTAINER_HOST_jupyter_http

2020-08-13 13:48:05 1752 4

原创 UBUNTU更新源出现错误解决方法小结

直接去网址:http://www.zzvips.com/article/73292.html

2020-08-11 20:39:33 505

原创 docker用法零散记录

启动一个容器一定要加名字,这样好识别docker run --name benjamin-ubuntu -it ubuntu:18.04 /bin/bash- it:表示交互式进入ubuntu:18.04:REPOSITORY:TAG/bin/bash:进入命令行更新镜像首先进入对应容器做一番操作,然后退出:exit接下来用一条查看指令:docker ps -l 查看最近一个进程或docker ps -n int 查看最近几个进程点击放大查看接下来更新镜像,操作指令如下:

2020-08-10 12:44:56 242 1

原创 CMake快速拾起基本语法

CMake Practice.pdf是一本非常好的CMake学习资料,时间有限,暂不在CSDN里面做记录,但把相关的pdf和亲手实践的内容存在了github上:https://github.com/bianjie0618/CMakeNote,等到具体应用时,再查阅温习。

2020-08-05 16:52:09 117

转载 简单理解:动态库与静态库区别

引:最近做了算法产品化相关的一些工作,其中涉及到算法库封装的相关工作,封装为动态库。总结动态库和静态库区别和对应使用原则。区别:静态库和动态库最本质的区别就是:该库是否被编译进目标(程序)内部。分别介绍:静态(函数)库一般扩展名为(.a或.lib),这类的函数库通常扩展名为libxxx.a或xxx.lib 。这类库在编译的时候会直接整合到目标程序中,所以利用静态函数库编译成的文件会比较大,这类函数库最大的优点就是编译成功的可执行文件可以独立运行,而不再需要向外部要求读取函数库的内容;但是从升级.

2020-08-04 22:30:06 192

转载 vim同时打开多个文件,并进行切换,不是分屏那种

vim 打开可以一次打开多个文件vim a b c命令vim a b c其它会同时打开a, b, c三个文件, 而不是退出a后才打开b, 退出b后才打开c, 你编辑a时, b和c的缓冲区已经在后台存在,用ls命令可查看所有缓冲区, 不是linux系统ls命令::ls 1 %a "a" line 1 2 "b" line 0 3 "c"

2020-08-04 19:01:07 2196

转载 vim查找指令

一、vi查找:当你用vi打开一个文件后,因为文件太长,如何才能找到你所要查找的关键字呢?在vi里可没有菜单-〉查找,不过没关系,你在命令模式下敲斜杆(/)这时在状态栏(也就是屏幕左下脚)就出现了 “/”然后输入你要查找的关键字敲回车就可以了。如果你要继续查找此关键字,敲字符n就可以继续查找了。值得注意的是“/”是向下查找,而“?”是向上查找,而在键盘定义上“?”刚好是“/”的上档符。二、vi替换:vi/vim 中可以使用 :s 命令来替换字符串以前只会使用一种格式来全文替换,今天发现该命令有很多种写法

2020-08-04 16:51:15 19338

转载 PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR区别

一般来说,都是这样用cmake .这样PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR是等价的。也就是当前源码的目录。如果执行cmake的时候,并不在源码的路径的话,比如cmake ../src这样的好处是cmake生成的文件和编译出来的东西,就不放在源码路径下了,保证了源码路径的干净整洁。比如可以在src的同级目录下建立build目录。然后在build目录下执行cmake ../src。这样编译出来的东西和cmake生成的东西,都放到了build目录下了。并且P

2020-08-04 11:49:16 2459 2

转载 cmake:target_** 中的 PUBLIC,PRIVATE,INTERFACE

CMake是一个很强大的跨平台构建系统,但是学习难度也蛮大的1. 指令说明target_include_directories():指定目标包含的头文件路径。官方文档target_link_libraries():指定目标链接的库。官方文档target_compile_options():指定目标的编译选项。官方文档目标 由 add_library() 或 add_executable() 生成。这三个指令类似,这里以 target_include_directories() 为例进行讲解。

2020-08-04 11:44:17 2825 2

原创 vim光标移动罗列

小跳:跳转到本行的最左边:0跳转到本行的最右边:$跳转到一个单词的下一个单词:w跳转到该单词的尾字母:e跳转到前一个单词的首字母:b (backword)跳转到前一个单词的尾字母:ge当前光标所在的行置为屏幕第一行: zt当前光标所在行置为屏幕中间行:zz当前光标所在的行置为屏幕最后一行:zd大跳:跳转到整个文本的第一行:gg跳转到文本的最后一行:G屏幕向下滚一屏:Ctrl+f(forward)屏幕向上滚一屏:Ctrl+b(backward)屏幕向上滚半屏:Ctrl+u(

2020-08-03 17:13:04 122

原创 事件机制懵懂记录

事件基本概念操作系统或应用程序内部发生某件事,程序的某个组件需要响应该事件,并进行特定处理面向对象架构中,事件响应函数最可能为成员函数问题:指向类的成员函数的指针不可能转换为哑型指针void*,也不能随意转换为指向另一个类的成员函数的指针解决方案:使用指向指向类成员函数的指针的指针,即二级指针实现策略:事件委托模型Event类模板:管理事件响应者对象,实现事件多播EventResponsor类模板:响应者对象与响应者行为配对Empty类:委托模型和指针转换认识不是很深,简单说说:

2020-07-30 22:31:13 122

转载 深入认识 右值引用与转发型引用、移动语义及完美转发

目录右值引用无名右值引用std::move()具名右值引用左右值重载策略移动构造器和移动赋值运算符移动语义转发型引用完美转发std::forward()加餐:std::move和std::forward源码分析预备知识std::movestd::forward右值引用左值传统左值:可以放在等号左边被赋值的值(变量)新型左值:具名右值引用本事也是左值右值不能放在等号左边被赋值操作的值,也就是临时对象,没有变量名,也没有分配内存空间将亡值概述:无论是左值引用,还是右值引用,他们都是引用。

2020-07-29 22:21:07 263

转载 模板的<显示><隐式>体化、<显示><隐式>调用和【模板特化】理解

目录C++模板之隐式体化、显示体化、隐式调用、显示调用和模板特化区分1. 隐式体化1.1 模板隐式体化的定义1.2 函数模板隐式体化1.3 类模板隐式实例化2. 显示体化2.1 模板显示体化的定义2.2 函数模板的显示体化2.3 类模板的显示体化3. 函数模板的调用方式3.1 隐式模板实际参数调用3.2 显示模板实参调用4. 模板特化4.1 模板特化的定义4.2 函数模板特化4.2.1 使用函数重载替代函数模板特化4.3 类模板特化5. 总结C++模板之隐式体化、显示体化、隐式调用、显示调用和模板特化区分

2020-07-28 20:00:37 290 1

原创 标准模板库用法介绍

目录标准模板库的内容标准模板库型式的使用方法复数 类模板一般说明实部与虚部复数操作序偶 模板类一般说明使用规则向量模板类向量的目的向量的使用补充:随机数接口头文件声明实现随机数库测试迭代器迭代器的性质迭代器的典型使用方法迭代器的分类指针作为迭代器常迭代器流迭代器表表的使用表排序标准算法标准函子算术函子关系函子逻辑函子标准模板库的内容标准模板类:复数、序偶迭代器标准容器:向量、表、栈、堆、队列、集合、映射等标准算法:查找、排序等标准模板库型式的使用方法<>:模板名称<数据

2020-07-28 11:11:10 322

原创 C++类型转化、运行期型式信息

目录运行期型式信息typeid操纵符与type_info类type_info 类typeid操纵符对象转型模板使用方法转型操作模板的工作原理模板特点模板用途dynamic_cast动态转型的三种方式指针的动态转型引用的动态转型示例static_castconst_cast示例reinterpret_cast重释转型的目的重释转型的问题示例运行期型式信息RTTI运行期标识对象的型式信息优势:允许使用指向基类的指针或引用自如自如地操作派生类对象typeid:获取表达式的型式;type_info:型式

2020-07-27 18:33:13 194

原创 群体数据——数组、链表、栈、队列

目录线性群体的概念数组类模板动态数组类模板程序链表的概念与结点类模板顺序访问的线性群体——链表类单链表的节点类模板在当前结点之后插入一个节点删除当前结点之后的结点链表的基本操作栈类栈的基本状态栈空栈满一般状态栈的基本操作栈类模板栈的应用队列队列的基本状态队空队满一般状态循环队列线性群体的概念群体是由多个数据元素组成的集合体。群体可以分为两大类:线性群体和非线性群体线性群体中的元素按位置排列有序,可以区分为第一元素、第二元素等。非线性群体不用位置顺序来标识元素。线性群体中的元素次序与其逻辑位置关系

2020-07-23 13:36:38 640

原创 一篇文章看懂 函数模板与类模板

函数模板思考:如果重载的函数,其解决问题的逻辑是一致的、函数体语句相同,只是处理数据的类型不同,那么写多个相同的函数体,是重复劳动,而且还可能因为代码的冗余造成不一致。解决:使用模板例:求绝对值的模板问题:整数类型和浮点类型求绝对值的算法,需要写两种重载 函数体吗?解决:函数模板创建一个通用功能的函数支持多种不同的形参;简化重载函数的函数体设计。...

2020-07-21 22:29:40 265

原创 (void**)ptr操作的理解

首先来说,ptr是一个指针,首先看一个简单的int* ptr;void* p1 = (void*)ptr; 表示把整型指针进行强制类型转换成空类型指针void类型指针接受任何类型的指针变量复制,因为他仅仅接收的是变量的首地址。float **ptr;int **p = (int **)ptr; // 指针的强制类型转换指针的类型是指明指针向后偏移多少个字节。...

2020-07-20 22:59:03 2216

原创 C++“多态性”理解一篇即上道

多态性运算符重载的规则双目运算符重载为成员函数单目运算符重载为成员函数前置单目运算符重载规则后置单目运算符 ++和--重载规则运算符重载为非成员函数虚函数为什么要有虚函数?一般虚函数虚析构函数虚表与动态绑定虚表示意图纯虚函数抽象类抽象类作用override与final显式函数覆盖final运算符重载的规则运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时导致不同的行为。不能重载的运算符:“.”、“.*”、“::”、“?:”重载之后运算符的优先级和结合性都不会改变。

2020-07-20 17:40:21 166

原创 C++继承与派生快速扫盲篇

继承与派生继承的基本概念和语法继承与派生的目的单继承时派生类的定义多继承时派生类的定义继承方式公有继承(public)私有继承和保护继承私有继承(private)保护继承(protected)类型转换派生类的构造和析构派生类的构造函数单继承多继承构造函数的执行顺序派生类拷贝构造函数派生类未定义拷贝构造函数的情况派生类定义了复制构造函数的情况派生类的析构函数派生类成员的标识与访问访问从基类继承的成员虚基类虚基类及其派生类构造函数继承的基本概念和语法继承与派生的目的继承的目的:实现设计与代码的重用。派

2020-07-20 17:32:30 127

原创 函数调用值传递栈框架的理解、以及g++优化编译的简单认识

1. 函数返回值是一个对象时,调用拷贝构造函数的过程描述// 文件名:callfuncTest.cpp#include<iostream>using namespace std;class IntNum {public: IntNum(int x = 0) : xptr(new int(x)){ //构造函数 cout << "Calling constructor..." << endl; } IntNum(const IntNum &

2020-07-18 15:53:51 108

原创 数组、对象数组、指针、动态内存分配、vector对象、string类

目录数组的存储与初始化一维数组的存储一维数组的初始化二维数组的存储二维数组的初始化数组作为函数的参数对象数组对象数组的定义和访问对象数组的初始化数组元素所属类的构造函数基于范围的for循环指针的初始化和赋值指针变量的初始化指针变量的赋值运算指针空值nullptr指针的算术运算指针p加上或减去n指针的++、--运算指针类型的关系运算用指针访问数组元素定义指向数组元素的指针指针与数组指针数组指针与函数以指针作为函数参数指针类型的函数指向函数的指针函数指针的典型用途——实现函数回调对象指针定义this指针动态内存

2020-07-17 17:59:48 415

原创 类的静态成员、类的友元、共享数据的保护、多文件结构

类的静态成员静态数据成员用关键字static在声明(声明都是在类体内完成的)为该类的所有对象共享,静态数据成员具有静态生存期必须在类外定义和初始化,用::来指明所属的类。静态数据成员在类外定义和初始化是有原因的,主要目的是为了灵活设定静态数据的初始值。静态函数成员类外代码可以使用类名和作用域限定符来调用静态成员函数静态成员函数主要用来处理该类的静态成员数据,可以直接调用静态成员函数。如果访问非静态成员函数,可以通过对象来访问。#include <iostream&gt

2020-07-15 18:44:59 557

原创 标识符的作用域与可见性、对象的生存期

目录标识符的作用域与可见性函数原形作用域局部作用域类作用域文件作用域可见性对象的生存期静态生存期动态生存期标识符的作用域与可见性作用域是一个标识符在程序正文中有效的区域。作用域分类:(逐渐扩大)函数原型作用域局部作用域(块作用域)类作用域文件作用域命名空间作用域函数原形作用域函数原型中的参数,其作用域始于(,结束于)。函数原形作用域举例:// 注意,area和radius都是标识符,但这里只有 radius 位于函数原型作用域double area(double radiu

2020-07-15 18:36:57 452

原创 类的成员函数、结构体、联合体、枚举类

类的成员函数在类中说明函数原型;可以在类外给出函数体的实现,并在函数名前使用类名和作用域限定符::加以限定也可以直接在类中给出函数体,形成内联成员函数允许声明重载函数和带默认参数值的函数内联成员函数:为了提高运行时效率,对于较简单的函数,可以声明为内联形式内联函数中不要有复杂结构(如循环语句和switch语句)在类中声明内联成员函数的方式将函数体放在类的类体中在类外使用inline关键字通过以上描述可以发现,类外定义的类成员函数既可以是内联函数(要使用关键字inline)

2020-07-14 15:51:36 503

原创 codeblocks多文件联合编译注意事项

多文件联合编译需要注意设置每个源文件的属性里的Build选项,让其即在debugger范围,又在release选项。在头文件书写正确的情况下,就可以顺利多文件联合编译了。

2020-07-12 09:42:51 583

原创 易错记录--持续更新

对于 ++ 理解来看这么一道题:int n = 0;while(n++ <= 2);cout << n;A. 2B. 3C. 4D. 语法错误为什么输出结果是 4 呢?可以这么看while(n <= 2, n+=1);// 这当然是伪代码,后面的n+=1不会放到循环体中执行,执行完逻辑判断会立刻自加1// 所以在n=2时, while(2 <= 2, n=2+1),这一步n已经变成3了,但此步while判断为真,继续执行// n = 3时,w.

2020-07-10 09:43:02 256

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除