c++
文章平均质量分 71
云端一散仙
主要在做图像,点云方向,欢迎讨论~
展开
-
CMake初始用
CMakeLists.txt 的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的,符号"#"后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。原创 2023-12-19 13:26:24 · 804 阅读 · 0 评论 -
c++ std::variant用法
在 C++17 之前,为了改进这些问题,提出了std::variant。原创 2023-11-21 11:19:38 · 252 阅读 · 0 评论 -
C++ 多态
多态性(polymorphism)可以简单地概括为“一个接口,多种方法”,多态性指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性,运行时多态性。C++运行时多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(Override),或者称为重写。多态与非多态的实质区别就是函数地址是早绑定还是晚绑定。如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,地址是早绑定的。原创 2023-11-06 16:34:40 · 128 阅读 · 0 评论 -
c++ count和count_if
algorithm头文件下的count用于元素的计数,使用对象包括vector,list,set,数组等。first, last:在元素序列的初始和最终位置输入迭代器。使用的范围是[first,last),它包含first和last之间的所有元素,包括first指向的元素,但不包括last指向的元素。val:要匹配的值。返回值:范围[first,last)中等于val的元素数。返回类型是有符号整数类型。关联容器map和set自带count函数,由于去重性,返回值只能是1或0,可以借此判断该元素是否存在。原创 2023-10-17 14:09:02 · 282 阅读 · 0 评论 -
c++ any_of,none_of,all_of
【代码】c++ any_of,none_of,all_of。原创 2023-10-17 13:52:15 · 129 阅读 · 0 评论 -
c++ fmt
fmt 是一个文本格式库,可以代替 C 的 stdio 和 C++ iostreams。实现了 C++20 的 std::format 标准。原创 2023-10-09 09:56:57 · 285 阅读 · 0 评论 -
c++ 智能指针
C++中的一个常见的错误就是。大部分情形中,这些bug来自动态分配内存和指针的使用:当多次释放动态分配的内存时,可能会导致内存损坏或者致命的运行时错误;当忘记释放动态分配的内存时,会导致内存泄露。智能指针可以帮助管理动态分配的内存。其来源于一个事实:栈比堆要安全的多,因为栈上的变量离开作用域后,会自动销毁并清理。智能指针结合了栈上变量的安全性和堆上变量的灵活性。申请了一份动态内存,使用之后释放了它。但是很容易会在函数结束前释放它,有一些原因会导致内存无法得到释放,比如函数提前终止。原创 2023-09-28 15:47:20 · 90 阅读 · 0 评论 -
c++ chrono
chrono是一个time library, 源于boost,现在是C++标准使用时,需要导入chrono,其所有实现均在std::chrono namespace下。chrono是一个模版库,使用简单,功能强大,有三个重要概念:duration、time_point、clock。原创 2023-09-26 14:23:02 · 270 阅读 · 0 评论 -
c++ std::reference_wrapper
reference_wrapper是一个模板类用类型T实例化的reference_wrapper类能包装该类型的一个对象,并产生一个reference_wrapper< T >类型的对象,该对象就像是一个引用,与普通引用最大的不同是:该引用可以拷贝或赋值。特点:没有默认构造函数,可以用一个想要引用的对象构造,或者用另一个reference_wrapper对象构造。原创 2023-09-26 13:42:46 · 170 阅读 · 0 评论 -
c++ unordered_set
可直译为“无序 set 容器”,即 unordered_set 容器和 set 容器很像,唯一的区别就在于 set 容器会自行对存储的数据进行排序,而 unordered_set 容器不会。本质是使用hash散列的方式存储数据,是一种使用hash值作为key的容器,所以当有频繁的搜索、插入和移除拥有常数时间。unordered_set存储原理是声明一个有n个桶的数据结构,计算加入到unordered_set的新的值hash,然后计算hash%n后的值x,将新的值加入到桶x中。原创 2023-09-21 11:23:01 · 498 阅读 · 0 评论 -
c++ decltype
decltype 是“declare type”的缩写,译为“声明类型”。C++11 新增的一个关键字,和 auto 的功能一样,都用来在编译时期进行自动类型推导。原创 2023-09-20 14:02:05 · 339 阅读 · 0 评论 -
c++ vector
(1)默认初始化,vector为空, size为0,表明容器中没有元素,而且 capacity 也返回 0,意味着还没有分配内存空间。这种初始化方式适用于元素个数未知,需要在程序中动态添加的情况。(2)两种方式等价 ,list2 初始化为list 的拷贝,list必须与list2 类型相同,也就是同为int的vector类型,list2将具有和list相同的容量和元素。原创 2023-09-19 13:34:17 · 344 阅读 · 0 评论 -
c++ static
静态在一个类中意味着特定的东西。这意味着在类的所有实例中,这个变量只有一个实例。如果某个实例改变了这个静态变量,它会在所有实例中反映这个变化。静态方法也是一样,无法访问类的实例。静态方法不需要通过类的实例就可以被调用。原创 2023-09-08 10:55:23 · 154 阅读 · 0 评论 -
c++ noexcept
一个 std::vector,若要进行 reserve 操作,一个可能的情况是,需要重新分配内存,并把之前原有的数据拷贝(copy)过去,但如果 T 的移动构造函数是 noexcept 的,则可以移动(move)过去,大大地提高了效率。在为某个异常进行栈展开的时候,会依次调用当前作用域下每个局部对象的析构函数,如果这个时候析构函数又抛出自己的未经处理的另一个异常,将会导致 std::terminate。需要注意的是,编译器不会检查带有 noexcept 说明符的函数是否有 throw。原创 2023-09-06 15:52:19 · 240 阅读 · 0 评论 -
c++ 回调函数,std::function,std::bind
定义回调函数的指针类型,包括返回值类型、(*类型名)函数指针、参数表回调函数的使用者函数符合函数指针类型的实现函数实现函数的类型必须要和函数指针的类型声明一致,也就是返回值和参数表(个数、类型)要完全一致。原创 2023-09-05 14:58:36 · 464 阅读 · 0 评论 -
git使用
误删除本地.git文件夹,可以重新建立连接。将已有的repository上传到git。创建一个新的repository。删除远程git仓库的文件/文件夹。设置global config。将已有的文件上传到git。原创 2023-09-04 15:38:21 · 505 阅读 · 0 评论 -
c++ folly::baton
Baton 通常用作线程间同步、等待、通知的标识符号,常用姿势是,一些线程调用 wait() 方法等待另一些线程完成某项工作,其完成以后调用 post() 方法进行通知。其跟一般PV信号量的区别是,Baton更轻量化、通知策略更简单(没有FILO/FIFO等策略)、仅能够通知一次,在简单场景中更高效。原创 2023-09-01 13:34:12 · 375 阅读 · 0 评论 -
c++ expected
和std::optional差不多,但是std::optional只能表示有正常的值或者为std::nullopt,即空值。而std::expected则可以表示一个期望的值和一个错误的值,相当于两个成员的std::variant,但是在接口上更方便使用。可以把它当作新的一种的错误处理方式。原创 2023-08-31 11:12:07 · 394 阅读 · 0 评论 -
pkg-config
编译配置的时候,需要依赖的库不一定都在 /usr/local/include 目录下,大部分情况下需要对编译器手动指定 include 目录,同理也可能需要对链接器手动指定 lib 所在目录,而由于不同系统下安装的库所在的目录不一定一致,会导致编译配置难以跨平台执行,可以用 pkg-config 来解决这个问题。原创 2023-08-31 10:23:10 · 1260 阅读 · 0 评论 -
c++ lambda
而一个使用了成员变量的类的 operator(),如果能直接被转换为普通的函数指针,那么 lambda 表达式本身的 this 指针就丢失掉了。但是函数内部想修改这变量,但是又不想影响lambda表达式外面的值的时候,就直接添加mutable属性,这样调用lambda表达式的时候,会像函数传递参数一样,在内部定义一个变量并拷贝这个值。如果用[this]、[=]或[&]捕获了,那么线程将运行未定义的行为,因为在传递给线程的lambda中打印name时,lambda将使用已销毁对象的成员。原创 2023-08-30 13:25:34 · 636 阅读 · 0 评论 -
c++ boost::json
Boost社区12月11日发布了1.75版本,在之前,Boost使用Boost.PropertyTree解析JSON,XML,INI和INFO格式的文件。但是由于成文较早及需要兼容其他的数据格式,相比较于其他的C++解析库,使用时不方便。Boost.JSON相对于Boost.PropertyTree来所,其只能支持JSON格式的解析,但是其使用方法更为简便,直接。原创 2023-08-29 16:52:29 · 558 阅读 · 0 评论 -
c++ future与promise
C++11中promise和future机制是用于并发编程的一种解决方案,用于在不同线程完成数据传递(异步操作)原创 2023-08-28 14:08:21 · 200 阅读 · 0 评论 -
c++ std::ref
对于函数式编程(如 std::bind),是对参数直接拷贝,而不是引用,std::ref的引入就是为了解决一些传参问题ref是个函数模板,用来构建一个reference_wrapper对象并返回,该对象拥有传入的elem变量的引用。如果参数本身是一个reference_wrapper类型的对象,则创建该对象的一个副本,并返回。原创 2023-08-28 13:10:55 · 409 阅读 · 0 评论 -
C++ Pimpl
Pimpl(Pointer to implementation,指向实现的指针) 是一种减少代码依赖和编译时间的C++编程技巧,其基本思想是将一个外部可见类(visible class)的实现细节(一般是所有私有的非虚成员)放在一个单独的实现类(implementation class)中,而在可见类中通过一个私有指针来间接访问该实现类。C++虽然不太常提到设计模式,但是对外接口和实现细节的分离仍然是必须的。原创 2023-08-25 16:43:58 · 174 阅读 · 0 评论 -
c++ define,typedef,using
define 是宏定义命令,宏定义就是将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替,是预编译命令,因此会在预编译阶段被执行“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。11;C++语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。#define 宏名。原创 2023-08-25 10:51:34 · 189 阅读 · 0 评论 -
boost::container
Boost.Container 提供与标准库相同的容器,专注于额外的灵活性。例如,这个库中的所有容器都可以在共享内存中与 Boost.Interprocess 一起使用——这对于标准库中的容器并不总是可行。boost::container::stable_vector,其行为类似于 std::vector,即使元素没有彼此相邻存储在内存中,仍然可以使用索引访问元素。Boost.Container 明确支持递归容器。标准库定义的容器是否可以递归使用取决于实现。Boost.Container 的递归容器。原创 2023-08-24 16:04:42 · 193 阅读 · 0 评论 -
folly::DynamicBoundedQueue
消费者消费了记录释放了空间,增加credit,意思是信用,而生产者要入队列,消耗了空间,增加的是debit,意思是借款,然后又转移到transfer里,消费者如果发现credit超出限额可以从transfer中取一些。这个动态队列因为内部是一个无界队列,不是固定的空间,所以比定长队列可以节省空间。最大容量较小,可用定长的MPMCQueue;队列元素有权重,默认为1;容量可调整,作为队列平衡了生产者消费者的不平衡。还可防止死锁,将容量增加到生产者不需等待的大小。通过队列元素的增减,管理内存的扩张与缩减。原创 2023-08-24 15:37:24 · 82 阅读 · 0 评论 -
c++ Google gflags
例如,在foo.cc 定义了一个 gflags 变量 DEFINE_string(name, ‘bob’, ‘’),在 foo.h 中声明 DECLARE_string(name),然后在使用该变量的文件中 include “foo.h” 就可以。SetVersionString() 和 SetUsageMessage() 一定要在 ParseCommandLineFlags() 之前设定。访问在另一个文件定义的 gflags 变量,使用 DECLARE_,它的作用就相当于用 extern 声明变量。原创 2023-08-24 11:26:39 · 191 阅读 · 0 评论 -
boost::array和boost::multi_array
Boost.Array是一个模板,需要两个模板参数,分别是数据的类型和数组的大小。由于是模板参数,所以数组的大小必须是一个可以在编译阶段就可以推理得到的值。定义以后,就可以正常使用了。其使用方法和std::vector较类似。原创 2023-08-22 11:12:49 · 193 阅读 · 0 评论 -
c++ optional
std::optional 是在 C++ 17 中引入到标准库中的,C++ 17 之前的版本可以通过 boost::optional 实现几乎相同的功能。原创 2023-08-10 16:23:57 · 409 阅读 · 0 评论 -
c++ boost circular_buffer
boost库中的 circular_buffer顾名思义是一个循环缓冲器,其 capcity是固定的当容量满了以后,插入一个元素时,会在容器的开头或结尾处删除一个元素。当插入了n个元素,队列满时last指针回转到头部,又与first指针相等了(如果没有使用pop_front读取过元素)。当不断使用push_back填充buffer,如下显示的是插入了n-1个元素,last始终指向下一个要插入的位置。如上first指针也改变了,buffer[0]已经是最新的元素,buffer[1]才是最老的元素。原创 2023-08-07 13:12:31 · 1244 阅读 · 0 评论 -
c++ mutex
在c++等高级编程语言中,锁也是用来提供“访问保护”的,Mutex,互斥量,就是互斥访问的量。只在多线程编程中起作用。从c++11开始,c++提供了std::mutex类型,对于多线程的加锁操作提供了很好的支持。原创 2023-08-07 14:57:28 · 189 阅读 · 0 评论 -
c++ map,multimap
/自定义比较方法 explicit map(const key_compare & comp , const allocator_type & a = allocator_type());} //自定义大到小比较函数 bool lower(int a , int b) {} //自定义小到大比较函数 int main() {1 , "小红" } , {3 , "小明" } , {2 , "小兰" } } , lower);原创 2023-08-04 17:16:46 · 156 阅读 · 0 评论 -
c++ default和delete
C++中,声明自定义的类型之后,编译器会默认生成一些成员函数,这些函数被称为默认函数。另外,编译器还会默认生成一些操作符函数,包括。原创 2023-07-14 17:35:19 · 271 阅读 · 0 评论 -
Google-glog使用记录
除了CHECK(),glog 还提供其它的宏,包括CHECK_EQ()、CHECK_NE()、CHECK_LE()、CHECK_LT()、CHECK_GE()和CHECK_GT()。glog 还提供了其它宏用来检查char *类型的字符串,包括CHECK_STREQ()、CHECK_STRNE()、CHECK_STRCASEEQ()和CHECK_STRCASENE(),带有 CASE 的版本表示大小写不敏感的。设置日志文件保存目录,这个目录必须是已经存在的,否则不能生成日志文件,且必须在初始化库之前调用。原创 2023-07-06 10:01:49 · 177 阅读 · 0 评论 -
(u)int8_t、(u)int16_t、(u)int32_t、(u)int64_t、size_t、ssize_t区别
=64int_t 是通过typedef定义的,而不是其它数据类型。因为跨平台,不同的平台会有不同的字长,所以利用预编译和typedef可以最有效的维护代码。原创 2023-07-05 14:30:36 · 152 阅读 · 0 评论 -
c++ const和constexpr
constexpr 是C++11中引入的关键字,声明为constexpr类型的变量,编译器会验证该变量的值是否是一个常量表达式,目的是将运算尽量放在编译阶段,而不是运行阶段。const并不能代表“常量”,只是对变量的一个修饰,告诉编译器这个变量只能被初始化,且不能被直接修改(实际上可以通过堆栈溢出等方式修改)。而这个变量的值,可以在运行时也可以在编译时指定。constexpr可以用来修饰变量、函数、构造函数。原创 2023-06-21 13:50:45 · 391 阅读 · 0 评论 -
c++仿函数
又称为函数对象(function object),使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了。简单来说就是一个能行使函数功能的类。既能像普通函数一样传入给定数量的参数,还能存储或者处理更多需要的有用信息。仿函数可以访问成员变量,成员函数可以很自然地访问成员变量。原创 2023-06-16 16:32:56 · 58 阅读 · 0 评论 -
c++ enum
什么是枚举类型?如果一个变量只有几种可能的值,那么就可以定义为枚举类型,比如:性别只有男和女,那么就可以将性别定义为一种枚举类型,其中男和女就是性别所包含的变量。所谓”枚举”是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。在C++中,枚举类型分为不限定作用域(enum)和限定作用域(enum class)。enum与enum class的区别?(为什么需要限定作用域?枚举作用域是指枚举类型成员名字的作用域,起自其声明之处,终止枚举定义结束之处。原创 2023-06-13 17:31:51 · 674 阅读 · 0 评论 -
c++ 读写文件
【代码】c++ 读写文件。原创 2023-06-13 17:08:26 · 32 阅读 · 0 评论