c/c++
文章平均质量分 62
bitcarmanlee
这个作者很懒,什么都没留下…
展开
-
c++,java,python,scala,shell三目运算总结
注意scala与python中if else表达式的不同在于,本质上是利用了scala中的自动推断语法,scala中任何表达式都是有值的,if else表达式的值是每个分支最后一行代码的结果。实际工作场景中经常会有各种语言一起混编的情况,混编的时候经常会大脑短路把各种语法混淆,或者某种语言有一段时间没编写忘了的情况,比如三目运算。python语法里面是没有标准三目运算符的,可以使用if else语法来模拟三目运算很方便。:这种语法,看下面的例子。c++ 与 java的语法中,都存在有标注的三目运算符。原创 2023-03-16 11:25:48 · 426 阅读 · 0 评论 -
c++分割字符串split方法实现
c++标准库中没有实现split函数,但是split字符串又是特别特别常见的常规操作。网络上能找到很多split的实现方式,下面记录一下本人认为比较优雅,可读性也比较好的两种实现方式。原创 2022-07-28 10:24:21 · 4198 阅读 · 0 评论 -
c++ vector二维数组初始化与vector切片
实际开发过程中,经常会使用vector嵌套的方式来模拟二维数组,下面我们详细分析一下如何对其进行初始化。同时array是动态数组,后面可以通过resize方法将其列数指定为2。我们还可以在创建vector的时候,直接指定vector的行数与列数。首先我们采用逐个初始化的方式,对二维vector进行初始化。上面的array,是3行2列的二维数组,默认初始值为0。注意实际使用的时候,B要及时进行clear操作。上面的run方法运行以后,得到的结果如下。上面我们首先指定array的行数为3。......原创 2022-07-27 16:08:22 · 5053 阅读 · 0 评论 -
c++ string类常见操作
反转字符串为常见的日常操作,在c++中可以用algorithm里的reverse方法进行操作。上述方法输出为使用reverse方法以后,字符串本身发生了改变。如果需要保留原有字符串,则可以再新创建一个字符串进行反转。插入字符可以使用push_back与insert方法。其中,push_back是在字符串尾部操作,而insert可以在字符串任意位置进行操作。3.字符串拼接append方法可以用来进行字符串拼接,”+“也可以收到同样效果4.字符串遍历遍历可以使用下标,也可以使用迭代器。迭代器可以原创 2022-06-17 11:21:05 · 967 阅读 · 1 评论 -
c++字符处理判断是否为数字字母,大小写转换
日常工作中经常会涉及到字符的处理。在c++中,cctype头文件里就包含有许多对字符的常规处理,下面我们来总结一下。isalpha可以判断一个字符是否为字母,如果是字母则返回1,否则返回零。2. 判断是否为数字isdigit可以判断一个字符是否为数字。是返回1,不是返回0。另外,在apple平台的clang++中,还有isnumber方法,查看函数签名,跟isdigit相同,最后的效果也与isdigit相同。3.判断是否是数字或字母isalnum可以判断字符是否是数字或者字母,是返回1,否返回0原创 2022-06-15 19:22:59 · 5630 阅读 · 1 评论 -
c++生成随机数详解(包含可执行代码)
c++中生成随机数最简单的方式就是rand函数。而且rand函数位于stdlib.h头文件中,不需要额外的再引入。从rand的函数签名不难看出其返回的是一个int类型。run1方法的输出为2.srandrand函数生成的是伪随机数。伪随机数的意思是,不管运行多少次,每次运行的结果都是一致的。为了解决伪随机数的问题,可以采用srand函数。srand的函数签名为可见要想使用srand,需要传入一个unsigned类型,一般就可以使用time方法。上述输出为3.生成一定区间的整数上面的分析我们看原创 2022-06-15 10:56:14 · 6275 阅读 · 0 评论 -
c++使用裸指针与智能指针返回数组详解
首先明确一点:c++代码中无法直接返回数组,这一点比较清晰简单,我们写个方法进行测试上面代码运行得到的结果为原因也很容易解释:我们在f1内定义的数组c,在f1执行完毕以后被系统释放掉,所以在调用f1方法得到的结果肯定就不是计算以后得到的正确结果。为了解决上面的问题,我们可以在函数内new一个数组出来,这样new出来的数组被分配在堆空间上,函数执行完毕不会被释放。上面代码运行因为上面的数组是在函数内new出来,而在调用以外释放,逻辑不是特别清晰,因此可以改为下面的方式因为c++中手动分配内存的一个原创 2022-06-09 10:36:11 · 1400 阅读 · 0 评论 -
c++ 字符串与数字相互转换
日常编码过程中,字符串与数字进行相互转换是常见的需求,下面我们总结一下在c++中,字符串与数字的转换都是如何来进行操作的。首先看看,在c语言的风格中,我们怎么做到把字符串转为数字。注意上述代码是在namespace为std的环境中运行。atoi, atof函数,均在stdlib.h中进行了声明,在头文件中,其声明的函数原型为不难看出,上面这些方法的输入均为const char *,即字符串,得到的输出为转化以后的各种数值类型。2.字符串转数字c++风格上面代码也是在namespace为std的环原创 2022-06-05 10:34:00 · 35158 阅读 · 0 评论 -
c++ list splice用法详解
项目开发过程中,发现stl中的list有splice方法,而且splice方法还挺实用,可以很方便地对链表进行一些连接断开的操作。因此我们下面来详细总结并实测一下splice的几种用法。splice有以上三种函数签名,其中list1表示被拼接的列表,操作以后其结构会发生改变(如果有改变的话)iterator position表示操作开始时list1的迭代器位置list2为将其元素拼接到list1的列表。iterator i是list2中要拼接的迭代器元素。iterator first, iter原创 2022-06-04 23:22:40 · 6337 阅读 · 0 评论 -
macos gdb调试c++若干问题
1.startup-with-shell’ is enabledgdb在运行run命令的时候,提示如下问题:Because `startup-with-shell’ is enabled, gdb has worked around this bycaching a copy of your shell. The shell used by “run” is now:/Users/wanglei/Library/Caches/gdb/bin/zsh解决方案:1.先退出gdb。2.cd到当前用原创 2022-05-29 22:09:19 · 492 阅读 · 0 评论 -
c++智能指针详解
1.什么是智能指针从比较简单的层面来看,智能指针是RAII(Resource Acquisition Is Initialization,资源获取即初始化)机制对普通指针进行的一层封装。这样使得智能指针的行为动作像一个指针,本质上却是一个对象,这样可以方便管理一个对象的生命周期。在c++中,智能指针一共定义了4种:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr。其中,auto_ptr 在 C++11已被摒弃,在C++17中已经移除不可用。2.原始指针的问题原始指原创 2022-05-18 22:00:05 · 33645 阅读 · 7 评论 -
c++ thread创建与多线程同步详解
1.thread的构造函数c++11以后,引入了新的线程库thread,这样可以方便多线程操作。std::thread中的构造函数如下默认构造函数 thread() noexcept初始化构造函数 template <class F, class …Args> explicit thread(F&& f, Args&&… args);复制[delete] thread(const thread&) = delete;移动 thread(th原创 2022-05-18 16:48:48 · 2285 阅读 · 0 评论 -
c++多态及虚函数表内部原理实战详解
1.多态实现方式c++的多态机制主要是靠虚函数来实现。具体来说,就是用父类的指针指向子类的实例,然后通过父类指针调用子类对象中的成员函数。这样,就实现了父类指针的“多态"。想了解虚函数实现机制,就必须先了解对象的存储方式。2.类的存储方式我们以为的存储方式是这样:上面的图,表示对象的数据和函数代码都要分配内存空间,这样内存的利用效率显然较低,因此实际上存储方式是这样:每个对象占用存储空间的只是该对象的数据部分(虚函数指针和虚基类指针也属于数据部分),函数代码属于公用部分。我们常说的“A对象的成原创 2022-05-17 22:12:19 · 3721 阅读 · 0 评论 -
c++ map unordered_map使用大全
1.插入元素map中插入元素的方法有如下集中1.1 直接用[]符map<int, string> mymap;mymap[1] = "a";map的源码中重载了[]操作符,map<_Key, _Tp, _Compare, _Allocator>::operator[](key_type&& __k){ return __tree_.__emplace_unique_key_args(__k, _VSTD::piecewise_c原创 2022-05-17 16:27:43 · 21318 阅读 · 3 评论 -
c++ auto与function用法
1.auto关键字的用法auto是c++中的关键字,主要用法有两条,第一条就是根据初始化表达式自动推断该变量的类型。void f2() { auto a = 1; auto b = 1.0; auto c = "abc"; cout<<typeid(a).name()<<endl; cout<<typeid(b).name()<<endl; cout<<typeid(c).name()<&l原创 2022-05-16 21:31:57 · 2250 阅读 · 0 评论 -
c++ lambda表达式与函数对象
1.lambda表达式语法c++11以后引入了lambda表达式。lambda表达式还是很好用的一个东东,谁用谁知道。对比java,java8中也引入了lambda表达式,好评如潮,确实在很多场景中能发挥很大的作用。下面我们就来看看lambda表达式的使用。lambda表达式的完整声明语法如下[capture list] (params list) mutable exception-> return type { function body }capture list: 表示捕获的外部变量原创 2022-05-16 12:03:18 · 583 阅读 · 0 评论 -
c++ 函数指针实例详解
1.函数指针1.1 什么是函数指针每一个函数,都会占据一部分内存单元,这部分内存单元有一个起始地址。指向函数入口起始地址的指针称为函数指针。1.2 函数指针的语法1.2.1 如何定义函数指针数据类型 (*指针变量名字)(参数列表)首先我们需要注意上面的数据类型是指函数的返回值类型。1.2.2 注意括号其次,我们重点看一下下面两个写法void (*p)(char a, char b)void *p(char a, char b)上面那一句,表示的是一个函数指针。该函数指针所指向的函数原创 2022-05-16 11:09:34 · 2030 阅读 · 0 评论 -
c++ default override delete关键字
0.前言c++11中,新增加了许多关键字与新用法。下面我们针对c++11里面的新特性,来看看这些关键字的用法。1.default在阅读项目源码时,看到许多default关键字,我们先通过一个例子来说明default的用法。class Person { private: string name; public: Person(string _name) : name(_name) {}};int main(int argc, char const原创 2022-05-11 10:40:02 · 1321 阅读 · 0 评论 -
c++野指针小结
1.什么是野指针所谓野指针(wild pointer),简单讲是指指向不可用的内存区域的指针。需要注意的一点是,野指针与NULL空指针是不同的。NULL指针一般比较好判断,直接用if (p==NULL)语句判断即可。但是野指针指向的是垃圾内存区域的指针,一旦使用往往会造成不可预测的结果,这种随机不可预测的结果才是最可怕的。2.未初始化造成野指针最常见的情况之一就是指针未被正确初始化。任何指针在被创建的时候,不会自动变成NULL指针,他的default值是随机的。所以一个比较好的习惯是,指针刚创建的时候原创 2022-05-05 11:00:26 · 5802 阅读 · 2 评论 -
c++数组初始化与删除用法大全
0.前言大家公认的c++学习曲线比较陡峭,在我看来很重要一个原因就是c++语法比较灵活,要实现某个功能可能有好多种写法都能实现,所以很多时候就容易给大家带来困扰,搞不清楚为什么要这么写,或者这么写到底为啥,跟我平时写的为什么不一样。比如我们常用的数组,其初始化/删除就有非常多的方式,而且这些方式也比较混乱,没有特别的规律,很容易把人给直接绕晕圈了。下面我们来针对数组的初始化/删除方式做一个总结,如果有不对或者不全的地方,大家可以进行指正补充。1.静态初始化比较常见的初始化方式为静态初始化。下面我们来看原创 2022-05-04 22:41:16 · 4532 阅读 · 0 评论 -
c++实现strcpy函数
1.strcpy函数最近看c++相关的内容,看到了strcpy函数相关,然后就想起来一件陈年往事。还是很多年前,本人刚毕业校招出去面试,去了当时的某国民搜索引擎公司。负责面试的老哥上来让我手撕code,说写个字符串的实现吧。我说这不很简单?python直接一个赋值就搞定了?java不也是一个赋值搞定?然后老哥自言自语,哦你没写过c++啊,那这确实不好弄,咱们换道题把。当时的我,确实coding比较少。最主要的是,确实基本没搞过c++,所以也没get到老哥的点。现在想想,那时候也真的是…不过毕业以后工原创 2022-05-02 20:57:02 · 10704 阅读 · 1 评论 -
c++ *p++ (*p)++ ++(*p)详细实战解读
0.前言不管是我们平时看代码,还是自己写代码,经常都会看到诸如*p++,(*p)++, ++(*p)等写法。确实迷惑性比较强,而且一查资料,各种各样说法不一,容易让人云里雾里。因此,本文结合代码,给一个最准确详细的解释。1.正确的结论我们先上准确的结论:*p++: 返回的是指针p指向的值。如果p是数组,则为数组的第一个元素。然后再将指针p自增1。(*p)++:返回的是指针p指向的值。如果p是数组,则为数组的第一个元素。然后再将该指针指向的值自增1。++(*p):获取指针p的位置取值,先自增1再返原创 2022-04-29 18:37:35 · 7221 阅读 · 3 评论 -
#ifndef #define #endif typedef typename
1.ifndef define endif我们经常在c++的头文件中见到一堆#ifndef #define #endif这种标识。这些到底是用来干啥的?在一个比较大的工程里,可能会出现一个头文件被多个文件同时include的情况。然后当这些文件编译链接成一个可执行文件的时候,会出现大量重复定义的错误。比如我们打开stl库中vector源码,开头就有这么一个定义#ifndef _LIBCPP_VECTOR#define _LIBCPP_VECTOR.......然后文件最后定义#endif原创 2022-04-29 10:21:18 · 421 阅读 · 0 评论 -
stl vector与list详细对比
1.vector与array的对比vector是stl中常用的容器之一。vector与数组array比较类似,可以看成是array功能更强大的升级版。与array的不同在于,array是静态数组,容量大小在数组初始化的时候就是固定的。而vector是一个动态数组,即vector可以动态调整数组大小而无须用户进行手动干预。因为vector的底层实现是数组,所以其优势是在尾部插入删除数据很快,时间复杂度只有O(1)。而当其在头部或者其他位置插入删除数据时,因为需要对元素进行移动复制,所以效率会很低。2.v原创 2022-04-27 15:45:09 · 1326 阅读 · 0 评论 -
vscode配置c++11
1.vscode默认c++98在macos安装vscode以后,默认的c++版本为98。这个版本相对比较老,对很多新特性新语法也不支持。比如如果我们使用如下增强型for循环for(int n: listnum) {...}vscode会提示:range-based for loop is a C++11 extension [-Wc++11-extensions]因此,我们需要将vscode中的c++版本进行设置。2.tasks.json配置c++11tasks.json是对编译进行相关配原创 2022-04-26 11:21:16 · 12784 阅读 · 4 评论 -
mac vscode配置c++ debug环境
0.debug环境重要性对于开发代码来说,代码的可跟踪调试还是很重要的,能帮助我们快速定位发现问题,提高代码的健壮性,并提高平时工作效率。正好最近开发c++代码,使用了vscode,记录一下vscode上搭建debug环境的经过。虽然看着很简单,其实还是花了一些时间的。1.vscode是什么vscode是Microsoft开发并且开源的,全名是Visual Studio Code,但实在太冗长,所以一般叫vscode。微软官方给他的定义是一个免费开源的跨平台编辑器。强调“编辑器”的原因,应该主要是vs原创 2022-04-24 20:13:26 · 4663 阅读 · 1 评论 -
c++ explicit关键字解读
1.explicit的作用我们自己平时写c++代码时候,较少会用到explicit关键字。但是在c++相关的标准类库中,看到explicit关键字的频率还是很高的。既然出现频率这么高,那我们就来看看explicit的作用到底是啥。2.构造函数隐式转换为了理解explicit的作用,我们就需要先了解构造函数的隐式转换。为了明白构造函数的隐式转换,我们来看下面的例子。#include<iostream>#include<cstring>using namespace std;原创 2022-04-24 16:30:13 · 2630 阅读 · 0 评论 -
c++ struct与class
1.开篇在c++中,struct与class的区别其实不算特别大,两个关键词的用法在很多地方有相似之处。那为什么在c++中会有struct这个关键字呢?先说结论:主要原因是c++需要保留对c的兼容性,c中有struct,所以c++也保留。不光struct,很多其他地方也都是为了保留对c的兼容。2.c中的struct在c语言中,struct 只能包含成员变量,不能包含成员函数。所以在c语言中,struct中不能包括任何函数,否则编译器会报错,编译无法通过。c是一种面向过程的变成思路,面向过程认为数原创 2022-04-22 18:32:24 · 6595 阅读 · 0 评论 -
c++ const总结
1.const基本const,常量限定符,在c++中非常常见,用来限定特定变量,并告诉编译器,该变量不能修改。const用得好,能避免对不应修改的变量进行修改,提高代码整体的可靠性。2.定义常量const最常见的用法是定义常量了,比如const int a = 0;int const a = 0;以上两种写法都没有问题。void func1(const char c) { cout<<"c is: "<<c<<endl; c = 'e';原创 2022-04-21 16:03:53 · 698 阅读 · 0 评论 -
虚函数与纯虚函数
1.虚函数虚函数是 C++ 实现动态单分派子类型多态(dynamic single-dispatch subtype polymorphism)的实现方式。方法前面加上virtual关键字,即为虚函数。看下面的例子:#include<iostream>using namespace std;class A { public: virtual void func() { cout<<"A::func() is running原创 2022-04-17 18:11:21 · 1627 阅读 · 0 评论 -
c++派生类构造顺序
1.整体构造顺序前面我们提到过,一个类在构造的时候,先会构造其成员变量,在调用自身的构造函数。对于派生类来说,除了可能有成员变量,还可能有多个基类。在初始化派生类对象时,其构造函数要负责基类与基类成员对象的构造,还要负责自己成员对象的构造。2.构造格式前面也提到过,派生类只能使用构造函数初始化列表的方式,向基类与成员变量的构造函数传递参数完成初始化工作。具体形式如下:派生类构造函数(args):基类构造函数(args),成员对象1(args),成员对象2(args),…派生类对象构造的顺序为:原创 2022-04-16 20:44:32 · 4303 阅读 · 0 评论 -
c++三种实例化对象方式
1.隐式创建首先我们定义一个测试类class Person { private: int age; string name; public: Person() { cout<<"this is construct~"; } Person(int age, string name) { this->age = age; this-原创 2022-04-16 19:08:28 · 12374 阅读 · 3 评论 -
c++类成员变量初始化详解
1.类初始化顺序当类初始化的时候,会调用其构造函数并进行初始化。当对象结束其生命周期,会调用析构函数进行资源回收。注意类在调用资深构造函数之前,首先会调用其成员变量构造函数并进行初始化,再进入自身构造函数进行初始化。成员变量的声明顺序,就是初始化顺序。后面我们提到的很多情况就跟这个有关系,后面再进行详细解读。2.声明时初始化第一种方式是在成员变量声明时初始化。可以看如下示例。class D { int a = 10;};在声明变量a的时候即给其初始化为10。不过注意这种写法是c++1原创 2022-04-16 18:16:36 · 19013 阅读 · 1 评论 -
char * 与char []区别总结
1.先上结论c++代码里头经常见到char * 与char []的写法,这两种写法都可以表示一个字符串。比如:void charcode() { char* a = "c1"; char b[] = "c2"; printf("a=%s, b=%s", a, b);}上面这段代码,最后输出的结果为a=c1, b=c2所以这两种方式都可以表示字符串,那么区别到底是什么?我们先说结论,后面再来分析:char * 这种方式表示常量指针,char[] 这种表示指针常量!2原创 2022-04-14 17:07:53 · 19531 阅读 · 4 评论 -
c++ &符号用法
1.引用声明符号引用,就是给变量取另外一个名字。而只要这两个变量的任何一个发生变化,都会影响到另外一个与其一起发生变化。看如下示例代码void f1() { int a = 1; int &b = a; cout<<"a is: "<<a<<endl; cout<<"b is: "<<b<<endl; cout<<endl; a = 2; cout<原创 2022-04-13 17:27:56 · 3743 阅读 · 0 评论 -
c++ 指针与引用区别
1.基本概念指针:指的是一块内存的地址值。引用:是一块内存的别名。指针本质上就是存放变量地址的一个变量,逻辑上是独立的。他可以被改变,包括其指向的地址的改变和其指向的地址中所存放的数据的改变。而引用只是一个别名,逻辑上并不存在,在整个引用周期是不能被改变的,只能指向同一个变量。2.能否为空值指针是可以为空值的,可以不需要初始化。平时编程中,最讨厌的情况就是看到各种NullPointer,排查起来都不好排查。引用不能为空值,因此必须进行初始化。所以引用的一个优点是它一定不为空,相对于指针不用检查原创 2022-04-13 15:56:56 · 1153 阅读 · 0 评论 -
ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `CXXABI_1.3.9‘ not found
在运行某个Python代码的时候,IDE里报了上述错误,很明显是动态库的问题,解决方案如下1.检查动态库cd /usr/lib/x86_64-linux-gnusudo strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep CXXABI输出结果为CXXABI_1.3 CXXABI_1.3.1 CXXABI_1.3.2CXX...原创 2019-05-15 18:45:53 · 6934 阅读 · 2 评论 -
boost安装详细教程
1.下载boost的tar.gz包首先从boost官网上下载boost的gz包。 boost官网地址http://www.boost.org。2.解压gz包执行tar -zxvf boost_1_63_0.tar.gz命令,将gz包解压。3.执行bootstrap.sh脚本cd到刚才的解压包里,执行bootstrap.sh脚本sh bootstrap.sh4.执行b2执行完上述命令后,会生成b2可原创 2017-04-02 16:47:54 · 4638 阅读 · 0 评论