- 博客(19)
- 收藏
- 关注
原创 记录智能指针和string使用中发现的问题
在c++11中,想要智能指针指向数组,需要这样写intint注意两个shared_ptr和unique_ptr的模板参数不同。但是只有这样写在c++11中才能编译通过。但是在c++11 中, shared_ptr这种写法是有问题的。但是unique_ptr这种做法是正确的。因为shared_ptr的默认删除器是delete,指向数组时模板参数依然是单个元素类型,所以析构会调用delete 而不是delete[], 造成内存或资源泄露解决办法:1:升级到c++17。
2023-02-09 00:02:18
132
原创 shell批量修改文件
批量修改文件名,有时在linux服务上还是会碰到的,最近笔者就碰到了,记录一下比如我想将所有文件后加上.bak, 可以这么做其中需要注意的是xrags -i 和{}, -i表示一种占位符,从管道读取到的参数会替换掉占位符,一般默认的就是{} ,-i表示使用占位符,也可以用-I(大写的i)指定其他的占位符,所以这行shell意思就很简单了。如果我们想恢复原来的文件名呢,可以这么做:需要注意的可能是两点,sed后面有个2g, 我们知道g表示全部替换,2g表示从第二个匹配项开始,因为第一个匹配项是1
2021-07-12 23:59:09
464
原创 c++一种反射机制,判断类中是否存在特定的函数
c++语言本身并没有提供反射机制,倒是有一个比较基础的RTTI,利用c++的模板特性,SFINAE,可以实现一些反射功能,先看代码:在这里插入代码片
2021-05-30 23:08:56
787
1
原创 C++ SFINAE和 enable_if
c++中的SFINAE和enable_if,如果经常写模板的话,应该听到看到这些东西.SFINAE首先介绍下SFINAE,参考官方介绍,中文是“模板替换失败不是一种错误”,看个代码示例class Test { using newType = int;};// 1template<typename T> void f(T arg) { cout<<"old type"<<endl;}// 2template <typename T>v
2021-05-30 18:14:58
202
原创 C++ 11 decltype 与auto
c++11 新特性中,用的比较多的应该是类型推导了,类型推导有两种,auto与decltype,先说说auto.1: autoauto在使用时,最需要注意的应该auto会去掉CV(const , volatile)属性与引用,细说的话有三种情况:1:auto 后没有引用或指针int a = 1;const int ca = 1;const int &caref = 1;auto a1 = a;auto a2 = ca;auto a3 = caref;template<ty
2021-05-19 00:33:51
97
原创 奇异递归模板模式
奇异递归模板模式(可参见wiki)在一般的编程中应该是不多见的,笔者在书籍上(陈硕的linux 服务器端开发 和more effective中有见过),后来在实际开发中没想到还真的碰到了,这个在元编程中应该还是比较常见的。template <class T> struct Base{ void interface() { // ... static_cast<T*>(this)->implementation();
2021-05-07 23:59:52
251
原创 more effective c++读书笔记 第五章 技术 part2
条款31让函数根据一个以上的对象类型决定如何虚化这里的问题很简单class Base {virtual void funtion( Base& base){}};class A : public base {};class B : public base {};class C : public base {};现在,function 的参数都可能是A B C中的一个,但是不同的参数类型有不同的行为,如何根据参数类型决定funcion中的行为呢。因为是虚函数,所以在函数调用时,如
2021-04-13 00:27:12
91
原创 more effective c++ 读书笔记 第五章 技术 part 1
条款35将ctor和non member func 虚化作者在这里描述了一种场景class Base {}class Deveried1 : Base {};class Deveried2 : Base {};class Com {vector<Base*> vec;};现在想为vec赋值,需要新构造出来对象,但是根据磁盘数据构造,我们这个时候,我们需要一个额外的成员函数,让他来返回不同类型的派生类指针,他的行为好像是 virtual ctor。其实本意很简单,这里
2021-03-30 00:00:00
103
原创 more effective c++ 读书笔记 第四章 效率
条款16谨记80-20法则这里作者谈的多是理念,比如,80%的资源被20%的代码所使用。所以大部分时候,我们所写的代码是平凡的,也就是说,在80%的时间里,他不会对整体效率有影响(有趣了)。大部分人对瓶颈的查找是猜,但是应该用正确的工具来测量。条款17考虑使用lazy evaluation惰性求值的意思就是只有在被真正使用时才去做计算,比如写时复制这种特性。作者举了个例子:如string s1 = “hello”string s2 = s1;strng ctor 一般会使得s2拥有s1的副
2021-03-14 14:05:02
111
原创 more effective c++读书笔记 第二章 操作符
条款5对定制的类型转换函数保持警觉在class中可定制两种类型转换函数,一个是单自变量的构造函数(如果带默认参数,可以有多个变量),二是operator 类操作符的重载,这里的内容较基础。对于单自变量构造函数,现在可以用explicit 关键字,要求显示构造,即可避免默认的转换行为,对于不支持explicit的编译器,作者提供了一种做法class Array {public: class ArraySize { public: ArraySize(int s) : size(s) {}
2021-03-08 00:11:20
120
原创 more effective c++ 读书笔记 第一章
more effective c++ 读书笔记 第一章 :基础议题条款一仔细区别pointers和references区别指针和引用,没什么好说的,基础知识。不过有个有趣的问题,之前没有考虑过:char *pc = 0;char* ref = *pc本质上,还是说对空指针、 野指针解引用,然后绑定到对象上,这样对,是未定义的。条款二使用c++类型转换符这部分较为基础,值得注意的是,dynamic_cast 用于向下转型,如果指针转换失败,返回nullptr, 如果是引用,抛出异常。另外
2021-03-07 21:51:00
157
2
原创 shell中比较[]、test、[[]] 数字和字符串
比较写shell脚本时,if判断是经常需要使用的,shell中的比较有很多中,眼花缭乱,今天把常用的比较梳理一下[] 和test这两个其实是等价的,都是shell 内建命令,不过linux环境本身也提供了一个test命令,这个是外部命令,不过大多数情况下,我们调用的都是内建的testroot@LAPTOP-2MOIS3PQ:/home/li# type [[ is a shell builtinroot@LAPTOP-2MOIS3PQ:/home/li# type testtest is a
2020-11-21 21:59:32
332
原创 shell中的进程替换process substitution >() <()
进程替换shell中的进程替换是一个有意思的语法,语法很简单<(cmd)>(cmd)注意,这里的>和()之前不能有空格,否则就变成了重定向和开启子进程了。<(cmd)的意思是将括号内的命令输出到一个临时文件如:root@LAPTOP-2MOIS3PQ:/home/li# diff <(ls) <(ls -a)0a1,9> .> ..> .bash_history> .bash_logout> .bashrc>
2020-11-21 14:17:20
385
原创 shell中的$
shell中的$符号用的很多,今天来梳理一下:运算:可以用$(()) 来实现变量的计算,支持四则运算,括号优先级,移位,注意,bash内置的运算都不支持小数,可以用awk,bc等工具来实现$[],同$(())位置参数:一般我都会在awk和bash中使用:在awk中,$0代表整行,1...1 ...1...N对应那一行的第几列,在awk中有时会想用某个变量值代表$N中的数据,测试发现可以这么写:a=1; awk '{print $'\$a'}' file_name$a也是用单引号括起来的,这
2020-11-21 13:39:02
619
原创 ldd输出解释
ldd命令用来查看二进制文件所依赖的动态库,大家经常使用,ldd命令的输出却有些让人迷惑如:root@LAPTOP-2MOIS3PQ:/home/li# ldd `which ls` linux-vdso.so.1 (0x00007fffd7cf7000) libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007fbc41220000) libc.so.6 => /lib/
2020-11-10 00:28:27
1612
原创 再说linux命令行的管道
linux管道linux命令上的管道大家想必是经常用了 cat 1.txt | grep xxx; 这是常见的用法,说说管道,pipe是 liunx上常见的IPC方法,在 linux system programming 中有两种,有名管道和无名管道,有名管道可以用在任意两个进程,而无名管道只能用在有亲属关系的进程,如我们一般所写的命令行就是无名管道(我猜是,不知道shell会怎么做,当然可以不是:) )。管道是需要内核来做一些维护工作的(无名管道显然是进程持续性,但有名管道是不是呢,记不清,请翻阅un
2020-11-08 01:50:13
3282
6
原创 lzma算法
lzma算法分析这几天在公司主要在做压缩相关,记录一下所得。目前业界主流的压缩算法感觉并不多,好用的就Huffman,lz系列,其他的像差分编码,vlq编码,感觉只能做个数据预处理,或者一种小范围的压缩。lz系列有很多,主要有lz77 lz78 lzma,基本思想是一样的,都是一种字典编码,如,我有一段文本,里面有“abcdefabcde”,那么后面的abcde并没有必要,可以用前面的替代,所以,其实可存储为“abcd65”,6代表offset,5代表length,既用距离当前位置6字节,长度为5的字
2020-11-08 01:20:48
4209
原创 awk学习记录
awk小计##记录一下学习awk的东西awk进行流处理,我们一般主要是对列对象进行一些操作。awk命令格式:awk ‘pattern’ ‘action’ filename;其中pattern 代表匹配模式,如,我想匹配文件中的出现“test”的行,则可以写成,awk /test/ ‘{print $0}’ 1.txt;所有要进行的操作即action,要写成形如‘{}’的格式,‘’所包含的内容可以有这种格式:‘BEGIN …{} END…’,其中begin和end是在处理文本之前和之后可进行的操
2020-11-08 00:39:51
185
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人