- 博客(149)
- 资源 (6)
- 收藏
- 关注
原创 vscode显示120字符或者80字符提示线或者显示垂直标尺
一般规定一行代码不超过80或者120个字符。取决于团队的编码规范。文件-》首选项-》设置-》搜索或添加editor.rulers。vscode显示120字符或者80字符提示线或者显示垂直标尺。打开全局设置的settings.json。不同公司不同团队有不同的规定。效果,颜色可以根据需要设置。添加提示线并配置颜色。
2024-01-16 18:38:11 1048
原创 lambda中的constexpr变量
x 和 z 可以在 lambda 函数中使用而不被捕获,是因为它们具有不同的存储持续时间。x 是一个 constexpr 变量,这意味着它具有在编译时确定的常量值。另一方面,z 是一个全局变量,这意味着它具有静态存储持续时间,并且可以从程序的任何部分访问,包括在 lambda 函数内部。x 是一个 constexpr 变量,它在编译时被确定并存储在只读内存中。这是因为constexpr变量在编译期就已经被计算出来,并且它的值是在编译时确定的,所以在lambda表达式中使用它是安全的。
2023-05-08 15:05:21 194 1
原创 python的 __init__.py文件中使用__all__变量
显示函数的文档:在终端中运行pydoc module_name.function_name,其中module_name是包含要查看文档的函数的模块的名称,function_name是要查看文档的函数的名称。生成HTML格式的文档:在终端中运行pydoc -w module_name,其中module_name是要生成文档的模块的名称。显示模块的文档:在终端中运行pydoc module_name,其中module_name是要查看文档的模块的名称。显示pydoc的帮助:在终端中运行pydoc -h。
2023-05-05 16:45:49 1154
原创 C++ 预编译头文件(Precompiled Header,PCH)
后续编译时,如果其他源文件中也包含了同样的预编译头文件,编译器会直接使用之前生成的二进制文件,而不是重新预处理一遍头文件。它的原理是先将一些常用的头文件预处理,生成一个二进制文件(通常是.pch文件),然后在后续的编译中,直接引用这个二进制文件,避免了重复的预处理过程,从而提高了编译速度。例如,如果你预编译了“stdafx.h”头文件,你就会得到一个预编译头文件,每次你包含“stdafx.h”头文件时,编译器都会自动搜索名为“stdafx.h.gch”的预编译头文件。
2023-05-05 16:22:27 603
原创 聚合体初始化(aggregate initialization)
总的来说,在C++17中满足如下条件之一的对象被认为是聚合体是一个数组或者是一个满足如下条件的类类型classstructunion):没有用户定义的和explicit的构造函数没有使用using声明继承的构造函数没有private和protected的非静态数据成员没有virtual函数没有的基类然而,要想使用聚合体初始化来初始化基类中没有private或者protected的成员没有private或者protected的构造函数。
2023-02-01 17:19:07 718
原创 C++ 17 variant and visit
std::variant是C++ 17的重要新特性。它非常常用以至于不得不去学习它。它实际上是C语言中的union的拓展。它可以存储多种多样的类型,具体类型只有在运行时才能确定。你甚至可以存储自定义的类型。或者是定义一个元素都是variant的数组。这个数组里面每一个元素的类型都可以不相同!而std::visit是与之配套的访问器。通过std::visit能够不关心具体类型地写出算法,实现算法的泛用。
2022-11-17 13:12:37 598
原创 try_emplace向std::map实例中高效并有条件的插入元素
map是STL里重要容器之一。它的特性总结来讲就是:所有元素都会根据元素的键值key自动排序(也可根据自定义的仿函数进行自定义排序),其中的每个元素都是的键值对,map中不允许有键值相同的元素,因此map中元素的键值key不能修改,但是可以通过key修改与其对应的value。如果一定要修改与value对应的键值key,可将已存在的key删除掉,然后重新插入。cpp17 使用我们需要用键值对填充一个map我通常会使用insert或emplace函数对map。
2022-11-01 23:17:10 1922
原创 快速或安全的访问std::vector实例的方法, std::vector的插入排序
可能是STL容器中适用范围最广的,因为其存储数据的方式和数组一样,并且还有相对完善的配套设施。不过,非法访问一个vector实例还是十分危险的。如果一个vector实例具有100个元素,那当我们想要访问索引为123的元素时,程序就会崩溃掉。如果不崩溃,那么你就麻烦了,未定义的行为会导致一系列奇奇怪怪的错误,查都不好查。经验丰富的开发者会在访问前,对索引进行检查。这样的检查其实比较多余,因为很多人不知道有内置的检查机制。
2022-10-30 20:26:57 797
原创 向 lambda 传递 this的拷贝
lambda里捕获了 *this,所以传递进 lambda的是一份拷贝。因此,即使在 d被销毁之后使用捕获的对象也没有。如果我们使用[this]、[=]或者 [&]捕获 this,那么新线程将会陷入未定义行为,因为当线程中打印name的。这里,捕获 *this意味着该 lambda生成的闭包将存储当前对象的一份拷贝。向 lambda 传递 this的拷贝。时候将会使用一个已经销毁的对象的成员。
2022-09-18 16:33:07 933
原创 std::boolalpha
1.头文件#include <iostream>2.使用说明让输出流将bool解析成为true或者 false3、示例代码#include <iostream>void test_boolalpha(){ std::cout << "true is " << true << std::endl; std::cout << "false is " << false << std::endl;
2022-05-16 17:26:55 395
原创 函数名作为字符串输出(Function Names as Strings)
GCC 预定义了两个标识符来保存当前函数的名称。 标识符 __FUNCTION__ 包含函数在源代码中出现的名称。 标识符 __PRETTY_FUNCTION__ 包含以特定语言方式漂亮打印的函数名称。https://www.onlinegdb.com/ online gdb 验证这些名称在 C 函数中始终相同,但在 C++ 函数中它们可能不同。 例如,这个程序:#include <stdio.h>void test_macroFunction(int i, int j){
2022-05-16 17:16:46 317
原创 使用C++11解决内存泄露--智能指针
C++11提供了智能指针,使用智能指针后不需要用户自己释放内存空间,一旦使用时对象超出了自己的生命周期,就会进行自动释放,从而有效解决了内存泄露的问题。在实际编程时,有三种智能指针可供使用,分别是:std::shared_ptr、std::unique_ptr和std::weak_ptr。1 共享智能指针:std::shared_ptrstd::share_ptr指针的每一个拷贝都指向同一个对象,只有在引用计数为零时内存才会被释放。指针声明原型为:template class shared_pt
2022-03-25 10:45:18 1088
原创 常量表达式值 constexpr
常量表达式值(constant-expression value)。通常情况下,常量表达式值必须被一个常量表达式赋值,而跟常量表达式函数一样,常量表达式值在使用前必须被初始化。一、常量表达式1.1 运行时常量性与编译时常量性在C++中,我们常常会遇到常量的概念。常量表示该值不可修改,通常是通过const关键字来修饰的。比如:const int i = 3;const还可以修饰函数参数、函数返回值、函数本身、类等。在不同的使用条件下,const有不同的意义,不过大多数情况下,const描述的都
2022-03-24 17:08:23 1537
原创 C++基础之元编程与constexpr
元编程(metaprogramming)是一个典型的复合词,他由前缀 meta- 和词根 programming 复合而成,有“对一个程序进行编程”的意思。换句话说,编译器先编译你的代码,得到一份新的代码,然后再编译新的代码来解决问题。模板元编程技术,即把一些可以在编译时完成的求值计算,通过模板特化的技术绑定到具体的实例化代码上,从而减少不必要的代码量,提升代码的运行效率。一、C++的元编程1.1 为什么要元编程呢?前面我们知道了什么是元编程,那么为什么要有这种编写技巧呢?无外乎两点:减少重复的代
2022-03-24 14:16:48 2537 1
原创 模板偏特化 Partial specialization
偏特化是指如果一个 class template 拥有一个以上的 template 参数,我们可以针对其中某个(或多个,但不是全部)template 参数进行特化,比如下面这个例子template <typename T>class C {...}; //此泛化版本的 T 可以是任何类型template <typename T>class C<T*> {...}; //特化版本,仅仅适用于 T 为“原生指针”的情况,是泛化版本的限制版所谓特化,就是特殊情
2022-03-23 18:42:20 752
原创 std::vector
#include <iostream>#include <vector>#include <algorithm>using namespace std;int main(){ vector<int> v {1, 2, 3, 2, 5, 2, 6, 2, 4, 8}; const auto new_end (remove(begin(v), end(v), 2)); v.erase(new_end, end(v));
2022-03-17 17:37:17 496
原创 循环遍历map容器,erase元素的问题
#include <iostream>#include <map>using namespace std;int main(){ map<string,string> testMap{ {"cpp","cpppp"}, {"java","javaaaa"}, {"shell","shelllll"}, {"python", "pythonnnn"} }; map<st
2022-03-14 16:45:19 590
原创 c++11中 std::ref() 和 引用 &
使用std::ref可以在模板传参的时候传入引用,否则无法传递&是类型说明符, std::ref 是一个函数,返回 std::reference_wrapper(类似于指针)用std::ref 是考虑到c++11中的函数式编程,如 std::bind.C++11的设计者认为bind默认应该采用拷贝,如果使用者有需求,加上std::ref()即可。同理std::thread也是这样。example:#include <functional>#include <iostre
2022-03-11 15:58:46 592
原创 基于范围的for循环(range-based for statement)
cpp 11 支持基于范围的for循环for (del : coll){ statement}coll 里的内容会被逐个赋值给delvector<double> vec;...//拷贝赋值for (auto elem : vec){ cout<< elem << endl;}//引用传递for (auto elem& : vec){ elem *= 3;}第一种写法是拷贝赋值,修改elem并不会修改vec里的元素, 如果想要
2022-03-06 16:15:36 172
原创 Chrony使用以及配置为NTP server
ChronyChrony是一个开源的自由软件,如果在chrony配置文件中指定了ntp服务器的地址,那么chrony就是一台客户端,会去同步ntp服务器的时间,如果在chrony配置了允许某些客户端来向自己同步时间,则chrony也充当了一台服务器,所以,安装了chrony即可充当客户端也可以充当服务端。Chrony有两个核心组件,分别是:chronyd:是守护进程,主要用于调整内核中运行的系统时间和时间服务器同步。它确定计算机增减时间的比率,并对此进行调整补偿。chronyc:提供一个用户界面,用于监
2022-02-14 10:47:30 5827 2
原创 linux添加sudo权限
设定sudo,需要root权限,或者sudo users sudo vi /etc/sudoers1、定义SHUTDOWN变量所包含的关机操作命令。commands to shutdown/reboot the machineCmnd_Alias SHUTDOWN = /sbin/shutdown,/sbin/reboot,/sbin/halt,/sbin/poweroff2、添加普通用户的sudo权限,可以操作root能够操作的所有指令,但禁止其关机操作,同时取消sudo的密码交互
2022-01-06 17:13:14 1910
原创 openssl 解决编译错误以及安装不同版本的方法
常见错误示例:openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory问题分析:openssl version -a经过查看系统安装的动态库版本,发现没有对应版本,需要自行下载编译下载编译之后,动态库确实错误消失:下载编译方法:OpenSSL库的安装, 去官网下载最新版本官网:http://www.
2021-10-16 13:43:43 626
原创 2021-08-29
fstream提供了三个类,用来实现c++对文件的操作。(文件的创建、读、写)。ifstream -- 从已有的文件读ofstream -- 向文件写内容fstream - 打开文件供读写文件打开模式:ios::in 读ios::out 写ios::app 从文件末尾开始写ios::binary 二进制模式ios::nocreate 打开一个文件时,如果文件不存在,不创建文件。ios::noreplace 打开一个文件时,如果文件不存在,创建该文件ios::trunc 打开一个
2021-08-29 16:10:28 75
原创 C/C++ 中的static关键字
目录:静态成员变量(面向对象)静态成员函数(面向对象)静态全局变量(面向过程)静态局部变量(面向过程)静态函数(面向过程)1. (面向对象的)静态成员变量在类内成员变量的声明前加上关键字static,该数据成员就是类内的静态数据成员。#include <iostream>using namespace std;class Myclass{public: Myclass(int a, int b, int c); void GetSum();private: int
2021-08-15 14:58:01 246
原创 C++ 虚函数、纯虚函数
https://zhuanlan.zhihu.com/p/37331092https://blog.csdn.net/MUMU23333/article/details/80105446
2021-08-15 13:44:12 197
原创 C++11 decltype表达式
decltype在某些情况下,不需要或者不能定义变量,但是希望得到某种类型,这时候就可以使用 C++11 提供的 decltype 关键字了,它的作用是在编译器编译的时候推导出一个表达式的类型,语法格式如下:C++ decltype (表达式)decltype 是 “declare type” 的缩写,意思是 “声明类型”。decltype 的推导是在编译期完成的,它只是用于表达式类型的推导,并不会计算表达式的值。来看一组简单的例子:int a = 10;decltype(a) b = 99;
2021-08-08 10:34:24 1004
原创 C++11 auto
在 C++11 中增加了很多新的特性,比如可以使用 auto 自动推导变量的类型,还能够结合 decltype 来表示函数的返回值。使用新的特性可以让我们写出更加简洁,更加现代的代码。auto在 C++11 之前 auto 和 static 是对应的,表示变量是自动存储的,但是非 static 的局部变量默认都是自动存储的,因此这个关键字变得非常鸡肋,在 C++11 中他们赋予了新的含义,使用这个关键字能够像别的语言一样自动推导出变量的实际类型。1.1 推导规则C++11 中 auto 并不代表一种
2021-08-08 09:46:59 624
原创 C++11 继承构造函数
继承构造函数C++11 中提供的继承构造函数可以让派生类直接使用基类的构造函数,而无需自己再写构造函数,尤其是在基类有很多构造函数的情况下,可以极大地简化派生类构造函数的编写。先来看没有继承构造函数之前的处理方式:#include <iostream>#include <string>using namespace std;class Base{public: Base(int i) :m_i(i) {} Base(int i, double j) :
2021-08-07 19:33:13 210
原创 C++11 委托构造函数
委托构造函数委托构造函数允许使用同一个类中的一个构造函数调用其它的构造函数,从而简化相关变量的初始化。下面举例说明:#include <iostream>using namespace std;class Test{public: Test() {}; Test(int max) { this->m_max = max > 0 ? max : 100; } Test(int max, int min) {
2021-08-07 19:23:34 175
原创 C++11 using 语法
using 语法和 typedef 一样,并不会创建出新的类型,它们只是给某些类型定义了新的别名。using 相较于 typedef 的优势在于定义函数指针别名时看起来更加直观,并且可以给模板定义别名。在 C++ 中 using 用于声明命名空间,使用命名空间也可以防止命名冲突。在程序中声明了命名空间之后,就可以直接使用命名空间中的定义的类了。在 C++11 中赋予了 using 新的功能,让 C++ 变得更年轻,更灵活。1. 定义别名在 C++ 中可以通过 typedef 重定义一个类型,语法格式如
2021-08-07 19:08:48 1045 1
原创 C++11 final和override
C++ 中增加了 final 关键字来限制某个类不能被继承,或者某个虚函数不能被重写。如果使用 final 修饰函数,只能修饰虚函数,并且要把final关键字放到类或者函数的后面。修饰函数如果使用 final 修饰函数,只能修饰虚函数,这样就能阻止子类重写父类的这个函数了:#include <iostream>using namespace std;class Base{public: virtual void test() { cout <
2021-08-07 11:39:20 250
原创 C++ 11 & 14 中的Lambda表达式
auto func = [capture] (params) opt -> ret { func_body; };[捕获列表] (形参列表) mutable 异常列表-> 返回类型{ 函数体 }捕获列表:定义lambda函数所在的作用域中的指定变量可以在lambda函数中使用其中func是可以当作lambda表达式的名字,作为一个函数使用,capture是捕获列表,params是参数表,opt是函数选项(mutable之类), ret是返回值类型,func_body是函数体。各项的含义:
2021-07-28 21:04:08 373
OpenCV3.4.2-YOLOv3.7z
2020-03-04
numpy matplotlib 及其依赖whl文件包
2020-02-06
dbg_amd64.rar
2020-02-06
MFC图像处理.rar
2020-01-03
第十届蓝桥杯大赛选手资源数据包(单片机)
2019-03-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人