![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
一棵栗子树
一失足 千古恨 龙游浅滩遭虾戏;
君莫悔 待重头 卷土重来未可知。
展开
-
C++ 使用chrono库准确统计代码运行时间
简介chrono是C++的时间库,源于boost,在C++11中纳入了标准,相比于过去常用的GetTickCount()计时,chrono具有更高的精度,据说能够到达纳秒级别示例代码#include <iostream>#include <chrono>#include <iomanip> using namespace std;void main(){ auto start = chrono::high_resolution_原创 2022-01-18 11:15:44 · 2683 阅读 · 1 评论 -
C++ STL相关知识整理(二) iterator
五种迭代器类型注意,容器适配器 stack、queue 和 priority_queue 没有迭代器。output迭代器支持操作input迭代器forward迭代器bidirectional(双向)迭代器random-access迭代器迭代器与指针迭代器不是指针,是类模板,表现的像指针。他只是模拟了指针的一些功能,通过重载了指针的一些操作符,->、*、++、--等。迭代器封装了指针,是一个“可遍历STL( Standard Template Li原创 2020-07-31 16:19:40 · 210 阅读 · 0 评论 -
C++ STL相关知识整理(一) allocator
内存配置和对象构造分开一般而言,我们习惯的 C++ 内存配置操作和释放操作是这样的:class FOO{};FOO *pf = new FOO; delete pf; 我们看其中第二行和第三行,虽然都是只有一句,当是都完成了两个动作。但你 new 一个对象的时候两个动作是:先调用::operator new 分配一个对象大小的内存,然后在这个内存上调用FOO::FOO()构造对象。同样,当你 delete 一个对象的时候两个动作是:先调用FOO::~FOO()析构掉对象,再调用:.原创 2020-07-31 14:59:20 · 258 阅读 · 0 评论 -
C++ 实现split函数
JAVA ,Python等语言中都自带split方法,能够将长字符串根据某一字符分割为短字符串,但C++中没有提供该功能,有时使用比较不方便。对此,查找了相应资料,将实现代码记录如下:void supersplit(const std::string& s, std::vector<std::string>& v, const std::string& c){ std::string::size_type pos1, pos2; size_t len = s.原创 2021-11-16 10:31:04 · 4542 阅读 · 0 评论 -
C++ 跨文件使用全局变量
使用方法在头文件中声明变量,在cpp文件中使用。声明时使用extern关键字 告诉编译器去其他文件中寻找示例代码test.h#ifndef TEST_H#define TEST_Hint global_v;#endiftest.cpp#include <iostream>#include "test.h"using namespace std;int global_v = 1;void modify(){ global_v++;原创 2021-07-26 13:47:51 · 6966 阅读 · 1 评论 -
C++ istringstream的用法 刷算法题利器
istringstream用于C++风格的串流输入操作。使用时需要添加#include<sstream>这个头文件。刷算法题经常碰到一行数据 1,2,3,4,5 或者1 2 3 4 5这种用空格或者逗号隔开的数据。直接写if else 来拆字符串也可以,但还是 istringstream 来的方便,下面是用法#include <iostream>#include <stdio.h>#include<string.h>#include<原创 2020-11-16 16:00:18 · 249 阅读 · 0 评论 -
C++ 读取和写入txt文件
void readTxt(string file){ ifstream infile; infile.open(file.data()); //将文件流对象与文件连接起来 assert(infile.is_open()); //若失败,则输出错误消息,并终止程序运行 string s; while(getline(infile,s)) { cout<<s<<endl; } infile.原创 2020-11-16 10:13:46 · 12014 阅读 · 2 评论 -
C++读取文件夹下的所有文件名
网上各种博客上面都是这段代码:这段代码出处应该是 https://www.cnblogs.com/fnlingnzb-learner/p/6424563.html 这里记下这段代码并做个注解,方便以后查找使用#include<iostream>#include <string> #include <io.h> #include <vector> void getAllFiles( string path, vector<st原创 2020-11-16 09:40:53 · 4778 阅读 · 0 评论 -
C++ explicit关键字
在c++种explicit关键字只能用来修饰构造函数。使用explicit可以禁止编译器自动调用拷贝初始化,还可以禁止编译器对拷贝函数的参数进行隐式转换。explicit关键字只能用于类内部的构造函数声明上,而不能用在类外部的函数定义(函数实现)上,它的作用是不能进行隐式转换;explicit关键字作用于单个参数的构造函数,如果构造函数有多个参数,但是从第二个参数开始,如果各参数均有默认赋值,也可以应用explicit关键字。一般只将有单个参数的构造函数声明为explicit,而拷贝构造函数不要声明原创 2020-08-27 10:35:10 · 223 阅读 · 0 评论 -
C语言笔记 使用BackTrace查看调用堆栈
函数原型int backtrace(void **buffer, int size);返回调用堆栈buffer:提供一个指针的数组size:指定缓冲区的个数,即设置的调用深度int: 返回实际返回的调用深度每个地址指针由 函数名、地址偏移、返回地址组成char **backtrace_symbols(void *const *buffer, int size)...原创 2020-03-07 13:28:04 · 842 阅读 · 0 评论 -
C语言笔记 malloc 和 free
头文件#include <stdlib.h>函数原型void *malloc(long NumBytes);void free(void *FirstByte);malloc() 在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。如果希望在分配内存的同时进行初始化,请使用calloc()函数。size ...原创 2020-03-07 11:49:17 · 125 阅读 · 0 评论 -
C++笔记 多线程 区域锁的实现
概述确切的说,区域锁(Scoped locking)不是一种锁的类型,而是一种锁的使用模式(pattern)。这个名词是Douglas C. Schmidt于1998年在其论文Scoped Locking提出,并在ACE框架里面使用。但作为一种设计思想,这种锁模式应该在更早之前就被业界广泛使用了。区域锁实际上是RAII模式在锁上面的具体应用。RAII(Resource Acquisitio...原创 2020-03-06 23:10:52 · 710 阅读 · 0 评论 -
C语言笔记 互斥量与读写锁
头文件#include <pthread.h>互斥量初始化与销毁int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);int pthread_mutex_destroy(pthread_mutex_t *mutex);简单...原创 2020-03-06 23:03:27 · 591 阅读 · 0 评论 -
C语言笔记 信号量sem_t
头文件#include <semaphore.h>sem_initint sem_init(sem_t *sem, int pshared, unsigned int value);sem_init() 初始化一个定位在 sem 的匿名信号量。value 参数指定信号量的初始值。 pshared 参数指明信号量是由进程内线程共享,还是由进程之间共享。如果 pshar...原创 2020-03-06 22:48:28 · 4329 阅读 · 0 评论 -
C语言笔记 pthread_create pthread_join 和 pthread_detach
头文件#include<pthread.h>pthread_createint pthread_create(pthread_t *tidp, const pthread_attr_t *attr, (void*)(*start_rtn)(void*),void *arg);第一个参数为指向线程标识符的指针。第二个参数用来设置线程属性。第三个参数是线程运行...原创 2020-03-05 17:40:39 · 2896 阅读 · 0 评论 -
C++ 笔记 线程局部变量 thread_local
c++11 中添加了新的关键字thread_local,用来声明新的存储期(线程存储期变量),即线程局部变量。程序中的所有对象拥有下列存储期之一:1 自动存储期。对象的存储在外围代码块开始时分配,而在结束时解分配。除了声明为 static 、 extern 或 thread_local 的所有局部对象拥有此存储期。2 静态存储期。对象的存储在程序开始时分配,而在程序结束时解分配。只存在...原创 2020-03-05 11:46:01 · 1007 阅读 · 0 评论 -
C++ 笔记 关于拷贝构造函数的二三事
C++的拷贝构造函数为什么参数是const Test& s?参考:https://blog.csdn.net/TanJiaLiang_/article/details/866914371.Test(Test s)为什么不行?因为我们拷贝构造函数的参数Test s调用的也是拷贝构造函数,所以这样调用必然造成无穷无尽的递归调用,所以我们必须加引用&2.为什么要加cons...原创 2020-03-04 22:13:56 · 162 阅读 · 0 评论 -
C++ 笔记 typename的使用
先说结论,C++引入typename关键字是为了消除二义性在C++模板常有如下用法:template <typename T>int compare(const T &v1, const T &v2){ if (v1 < v2) return -1; if (v2 < v1) return 1; return 0;}...原创 2020-03-03 15:57:20 · 402 阅读 · 0 评论 -
C++ 笔记 yaml-cpp 的使用
yaml-cpp 是一个开源库,地址为 https://github.com/jbeder/yaml-cpp具体安装配置可参考以下博文:https://www.cnblogs.com/huodaozhe/p/12026327.htmlhttps://blog.csdn.net/briblue/article/details/89515470Yaml的语法可参考教程:http://w...原创 2020-03-03 15:21:21 · 2019 阅读 · 3 评论 -
C++ 笔记 dynamic_cast和dynamic_pointer_cast
dynamic_cast 是动态强制类型转换的意思,它将基类的指针或引用安全地转换成派生类的指针或引用。dynamic_pointer_cast 与dynamic_cast类似,将基类的智能指针转换为派生类的智能指针。参考资料:https://blog.csdn.net/jiayizhenzhenyijia/article/details/98209529https://www.c...原创 2020-03-01 23:30:28 · 769 阅读 · 0 评论 -
C++ 笔记 boost::lexical_cast数据类型转换器
lexical_cast是boost库中提供的数据类型转换器,用法如下:#include <boost/lexical_cast.hpp> string s = "123"; int a = lexical_cast<int>(s); lexical_cast的原型如下:template<typename Target, ty...原创 2020-03-01 23:12:15 · 415 阅读 · 0 评论 -
C++ 笔记 shared_from_this()的原理与使用
shared_from_this()的用途enable_shared_from_this是一个模板类,定义于头文件<memory>,其原型为:template< class T > class enable_shared_from_this; std::enable_shared_from_this 能让一个对象(假设其名为 t ,且已被一个 st...原创 2020-03-01 16:48:12 · 13062 阅读 · 2 评论 -
C++ 笔记 std::function bind 和 lambda表达式
lambda表达式一个lambda表达式表示一个可调用的代码单元,我们可以将其理解为一个未命名的内联函数。与任何函数相似,一个lambda具有一个返回类型、一个参数列表、一个函数体。但与函数不同,lambda可以定义在函数内部,一个lambda表达式具有如下形式:[capture list捕获列表](parameter list参数列表) {函数体},例子如下:auto f = ...原创 2020-03-01 16:12:39 · 787 阅读 · 0 评论 -
C++ 笔记 虚函数 虚函数表 纯虚函数 虚析构函数
什么是虚函数?允许派生类重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类或派生类的同名函数。什么是纯虚函数?基类中虚函数只有声明没有实现体。含有纯虚函数的类为抽象类,如果基类定义多个纯虚函数,子类没有一一将纯虚函数实现,那么子类依旧也会被认为是抽象类。因为纯虚函数不能被调用,所以包含纯虚函数的类是无法实例化的,那么这时候就出现了一个抽象类,它作为多个子类的共同基类,就...原创 2020-02-29 20:26:03 · 562 阅读 · 0 评论 -
C++ 笔记 可变参数函数
在C++中有时需要使用参数数目未知的函数,如输出日志等场景。这时需要用到头文件#include<stdarg.h>需要用到以下类型和方法va_listtypedef char * va_list; //可变参数列表va_start(ap,v) //获取可变参数列表的第一个参数地址,ap是类型va_list的指针,v是可变参数最左边的参数va_argva_ar...原创 2020-02-29 15:43:21 · 239 阅读 · 0 评论 -
C++ 笔记 define的使用
最近看到了一段很有意思的代码:const char* LogLevel:: Tostring(LogLevel::Level level) { switch(level) {#define XX(name) \ case LogLevel::name: \ return #name; \ break; XX(DEBUG); XX(INFO); XX(WARN); X...原创 2020-02-28 17:33:24 · 814 阅读 · 1 评论 -
C++ 笔记 const关键字修饰函数返回值
const 位于返回类型前,表明返回对象为常量,不可改变。如果修饰指向常量的指针。 1 const char * const helpFun() 2 { 3 char * p =new char[3]; 4 p[0]='a'; 5 p[1]='b'; 6 p[2]='\0'; 7 return p; 8 } 9 10 int ma...原创 2020-02-28 17:19:36 · 4341 阅读 · 0 评论 -
C++ 笔记 静态局部变量、类的静态成员和静态方法
用static修饰的成员变量在对象中是不占内存的,因为他不是跟对象一起在堆或者栈中生成,用static修饰的变量在静态存储区生成的,所以用static修饰一方面的好处是可以节省对象的内存空间。类中的static数据成员需要在类之外进行初始化。由于static修饰的类成员属于类,不属于对象,因此static类成员函数是没有this指针的,this指针是指向本对象的指针。正因为没有this指针...原创 2020-02-28 13:54:44 · 1372 阅读 · 0 评论 -
C++ 笔记 类的前置声明
类的前置声明主要解决两类问题:1.节约编译时间我们平时在写代码时会使用#include来包含其他头文件,然后调用这个头文件提供的一些类,如果该头文件里包含了很多其他没有被使用到的类,那么编译时会被一起编译,这样就会浪费一些不必要的时间,而使用前置声明,编译器就只编译我们需要用到的类,这样就会节约一点编译时间。这一点实际上是存在争议的,具体参考https://www.zhihu.com/que...原创 2020-02-28 13:14:50 · 479 阅读 · 0 评论 -
C++ 笔记 namespace 命名空间
1.全局作用域中定义的名字也就是定义在全局命名空间中,全局命名空间以隐式的方式声明,并且在所有程序中都存在。int i = 0;::i;2.嵌套的命名空间中,内层命名空间声明的名字将隐藏外层命名空间声明的同名成员。外层命名空间中无法直接访问内层中的名字。3.C++11中引入了内联命名空间,内联命名空间中的名字可以被外层命名空间直接使用。关键字inline必须出现在命名空间第一次...原创 2020-02-28 12:37:44 · 228 阅读 · 0 评论 -
C++ Primer 学习笔记 第9章 顺序容器 9.4 9.5 9.6
9.4 vector对象是如何增长的vector和string的实现通常会分配比新的空间需求更大的内存空间,容器预留这些作为备用,可用来保存更多的新元素。当需要的内存空间超过当前容量时,reserve调用才会改变vector的容量。如果需求大小大于当前容量,reserve至少分配与需求一样大的内存空间。在调用reserve之后,capacity将会大于或等于传递给的reserve参...原创 2019-08-29 10:50:24 · 351 阅读 · 0 评论 -
C++ primer 学习笔记 第9章 顺序容器 9.3 顺序容器操作
9.3 顺序容器操作9.3.1 添加元素向vector、string、deque中插入元素,会使指向容器的迭代器、引用、指针失效。在vector或string尾部之外位置,deque首尾之外位置添加元素,都需要移动元素。list、vector、deque、string支持push_back。放入容器的是对象值的一个拷贝,而不是对象本身。list、forward_...原创 2019-08-28 21:45:54 · 363 阅读 · 0 评论