C++
文章平均质量分 55
xinxiangwangzhi_
这个作者很懒,什么都没留下…
展开
-
C++函数模板、类模板、右值引用、万能引用、完美转发案例
模板原创 2022-10-21 18:05:26 · 408 阅读 · 0 评论 -
c++编程技巧--Pimpl
Pimpl原创 2022-10-18 17:02:12 · 284 阅读 · 0 评论 -
c++编程技巧--CRTP
CRTP原创 2022-10-18 17:01:21 · 373 阅读 · 0 评论 -
C++--生成模板动态库
模板与动态链接库原创 2022-10-15 20:22:39 · 2013 阅读 · 1 评论 -
C++---生成动态链接库
动态链接库原创 2022-10-15 20:19:09 · 622 阅读 · 0 评论 -
c++--bitset和位域
bitset和位域原创 2022-10-15 20:15:05 · 335 阅读 · 0 评论 -
c++关联容器排序问题
关联容器排序原创 2022-09-22 20:05:13 · 375 阅读 · 0 评论 -
c++编译过程
c++编译过程原创 2022-09-10 14:31:22 · 1274 阅读 · 0 评论 -
c++计时
c++计时原创 2022-09-10 14:25:44 · 556 阅读 · 0 评论 -
c++进阶--this指针与虚函数指针的关系
this指针和虚函数指针的关系原创 2022-07-31 22:32:10 · 1718 阅读 · 4 评论 -
vs平台glog使用
经常使用Ceres里面包含glog日志库,需要进行输出日志,索性使用glog。1、开源项目首页已经从https://code.google.com/p/google-glog/迁移到https://github.com/google/glog。当前主版本是0.3.4。2、下载代码后,双击根目录下的google-glog.sln,Visual Studio 2015提示先进行迁移,成功后就可以编译了。3、在解决方案下有四个工程:libglog(是动态链接库工程,生成libglog.dll和libglog转载 2022-05-17 10:09:23 · 861 阅读 · 0 评论 -
C++并行与并发
文章目录1cpu核数与线程1.1核心(core)1.2虚拟核(virtual core)2进程、线程、并发、并行2.1定义2.2区别3 C++与并行并发3.1c++与并发3.2c++与cpu并行3.3 c++与GPU并行写在前面的话:这篇文章借鉴了很多文章,csdn填转载需要很多链接,我这里被迫写成原创,借鉴文章都给出链接,如有侵权请联系我1cpu核数与线程1.1核心(core)一开始,每个物理 cpu 上只有一个核心(a single core),对操作系统而言,也就是同一时刻只能运行一个进程/线原创 2022-04-21 14:06:50 · 4344 阅读 · 3 评论 -
numpy和eigen索引方式比较
Eigen(c++)矩阵元素的访问:在矩阵的访问中,行索引总是作为第一个参数,Eigen中矩阵、数组、向量的下标都是从0开始。矩阵元素的访问可以通过”()”操作符完成。例如m(2, 3)既是获取矩阵m的第2行第3列元素。针对向量还提供”[]”操作符,注意矩阵则不可如此使用Numpy:从0开始,并接受从数组末尾开始索引的负索引,使用方括号’‘[]’'进行索引如:x[1,3]也可以x[1][3]二者结果等价,但第二种方式效率低于第一种方式,第二种会生成临时数组。参考:numpyeigen原创 2022-04-08 14:06:57 · 1164 阅读 · 2 评论 -
C++多态是否一定要使用指针分配动态内存?
“在C++语言中,当我们使用基类的引用或指针调用一个虚成员函数时,会执行动态绑定。”–c++ primer15.3根据上面这句话,c++并没有规定多态必须使用动态内存。**即栈和堆内存的指针和引用都可以进行多态。**利用栈上(stack)指针使用多态:class Base{ public: virtual void Display()= 0;};class Derived:public Base{ public: void Display()翻译 2022-03-21 10:24:57 · 515 阅读 · 0 评论 -
大小端字序
1.1大小端的由来一、为什么有大小端模式之分在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在除了8bit的char之外,还有16bit的short型,32bit的long型等等。另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。1.2大小端定义大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的原创 2022-03-20 20:30:29 · 1535 阅读 · 0 评论 -
c++字节对齐
对齐定义:现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。看一个代码struct STUDENT{ char a; int b;}data;理论上:char 占 1 字节,int 占 4 字节,所以总共占 5 字节。std::cout<<sizeof(data);原创 2022-03-17 17:21:24 · 931 阅读 · 0 评论 -
ceres求解非线性方程组
参考官网和一些文档试着写下以下非线性方程组求解除了官网文档,以下文档也值得学习:博客1博客2后方交会使用 Ceres Solver 求解非线性优化问题,主要包括以下几部分:【STEP 1】构建优化问题(ceres::Problem)【STEP 2】构建代价函数(ceres::CostFunction) 或残差(residual)【STEP 3】配置代价函数和损失函数(ceres::Problem::AddResidualBlock):通过 AddResidualBlock 添加代价函数(co原创 2022-01-08 19:32:30 · 1293 阅读 · 4 评论 -
win10超简单的方法编译Ceres
本文方法只需要VS、Ceres1.12.0源码、eigen源码、glog0.3.5源码。写在前面的话:win10需要单独下载并使用cmake编译依赖库(这时候就体现了Linux的好处)win10编译Ceres网上一大堆各种各样的教程,过程杂乱不一,还容易出各种问题,因此首选官方教程。打开官网意外的发现一句话:If you find the following CMake difficult to set up, then you may be interested in a Microsoft Vi原创 2021-12-28 11:54:05 · 2002 阅读 · 19 评论 -
直接初始化、拷贝初始化、赋值运算符
直接初始化、拷贝初始化、赋值运算符5.1直接初始化:通过匹配构造函数参数,直接调用构造函数(包含拷贝构造函数)完成初始化。5.2拷贝初始化:拷贝对象副本,或者对象右值引用,再通过调用拷贝构造函数或者移动构造函数实现初始化对象。拷贝初始化发生的6种情况://other:已有的对象T object = other; //(1) 使用等号,且非引用类型T object = {other}; //(2) (until C++11)使用等号,且非引用类型f(other) //(3)做为对象为一个值,作为原创 2021-10-29 17:04:13 · 397 阅读 · 0 评论 -
对象、声明、定义、初始化、赋值
对象、声明、定义、初始化、赋值声明不等于定义初始化不等于赋值对象:一块能储存数据,并具有某种类型的内存空间。声明:规定了变量的名字和类型,并不申请空间。定义:为对象分配储存空间,也可能赋予一个初始值。double geta();//函数声明int a//内置类型声明,并定义,初始值不确定初始化:当对象在创建时,获取了一个特定的值,我们说这个对象被初始化了,初始化不是赋值,初始化的含义是创建对象时赋予一个初始值。赋值:把对象的当前值擦除,用一个新的值来替代(即对象是已经存在的)。对于内置原创 2021-10-29 17:02:05 · 634 阅读 · 0 评论 -
位、字节、字符和sizeof
1、位:bit 数据存储的最小单位。每个二进制数字0或者1就是1个位;2、字节:字节(Byte)是计量单位,表示数据量多少,是计算机信息技术用于计量存储容量的一种计量单位,通常情况下一字节等于八位。 8个位构成一个字节;即:1 byte (字节)= 8 bit(位); 1 KB = 1024 B(字节); 1 MB = 1024 KB; (2^10 B) 1 GB = 1024 MB; (2^20 B) 1 TB = 1024 GB; (2^30 B)3、字符:字符转载 2021-10-20 17:36:44 · 645 阅读 · 0 评论 -
vector和数组的储存方式和使用
std::vector<int>vec{1,2,3,4,5};常规数组:元素储存在栈区int arr[10]={0};//元素0和变量arr均储存在栈区动态数组:元素储存在堆区//变量arr储存在栈区int *arr=new int[10]();//arr10个元素均为0,元素在堆区delete []arr;std::vector:元素一般储存在堆区std::vector<int>vec{1,2,3,4,5};vec作为局部变量的话存放在栈区中,作为静态变量原创 2021-10-20 15:39:08 · 3272 阅读 · 0 评论 -
常量表达式
常量表达式:值不会改变且在编译期就能得到计算结果的表达式。字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式。c++11允许将变量显式声明为constexpr类型,以便在编译器检查变量的值是否为一个常量表达式,声明为constexpr的变量一定是一个常量,且必须由常量表达式初始化 //数组大小必须为常量表达式,即在编译期就得到数组大小 const int rd = 7; int rr = rd - 1; int ra[rr];//错误,rr不是常量表达式原创 2021-10-19 18:19:43 · 2029 阅读 · 0 评论 -
何时使用动态内存?何时使用指针?
1动态内存转载 2021-10-08 22:52:10 · 478 阅读 · 0 评论 -
设计模式概述
设计模式一、概述设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代 码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。设计模式的分类Gang of Four的“Design Patterns: Elements of Resualbel Software”书将设计模式归纳为三大类型,共23种。转载 2021-06-22 20:52:24 · 123 阅读 · 0 评论 -
ceres最小二乘库--拟合曲线及代码分析
Ceres是谷歌开发的C++最小二乘库,可以用于求解线性和非线性最小二乘问题。最小二乘法的线性与非线性求解方法和Ceres配置可参考之前的博客。参考资料slam2案例123原创 2021-04-14 11:40:59 · 301 阅读 · 0 评论 -
C++运算符重载(1)
不同于c操作符重载,c++中依赖类对象.c++primer专门一章说明重载操作符,待后续更深入阅读。类内类外操作符重载如下:class Math{public: Math(int s) :s(s) {} int s; //必须要在类内定义的话,只能定义为单参数的运算符函数 //双目操作符应该有两个参数,但是成员函数第一个参数为隐式this指针,所以只能定义一个形参 bool operator <(const int &a) { std::cerr << "原创 2021-04-01 18:01:38 · 88 阅读 · 0 评论 -
C++--this指针
1什么是this指针在类中,this指针保存了该对象的地址,为指针常量(const pointer)(c++primer p231为常量指针,个人认为翻译有误应为指针常量,什么是指针常量参考之前的博客),总是指向“这个”对象,不允许改变this中保存的地址。2this指针与成员函数this是成员函数一个隐式参数,成员函数第一参数即为this指针。2.1当我们调用成员函数时,实际上是替某个对象调用它。成员函数通过一个名为 this 的额外隐式参数来访问调用它的那个对象,当我们调用一个成员函数时,用请原创 2021-04-01 17:08:02 · 165 阅读 · 0 评论 -
C++指针常量、常量指针、引用
写在前面的总结:常量指针(pointer to const):指针指向的对象是常量,可以指向变量和常量,不能通过指针改变指向对象的值,但是可以从一个对象指向另外一个对象(指针可变)。指针常量(const pointer):指针是一个常量,引用的定义即为指针常量,指针常量一旦指向一个对象之后就不能再指向别的对象(同引用,指针不能变),但是可以通过指针改变指向对象的值。const int p; // p 为常量,初始化后不可更改const int* p; // 常量指针,*p 为原创 2021-04-01 15:42:44 · 296 阅读 · 1 评论 -
C++迭代器初探(容器访问方式)
迭代器是一种访问容器的方式,可以访问所有标准库容器(顺序容器和关联容器),下标只能访问某些容器如vector、string,因此类似指针,迭代器是一种间接访问对象的方式。//1定义一个迭代器,类似vector<int>::size_type,我们不必关注迭代器的类型std::vector<int>::iterator it;//迭代器能够进行读写std::vector<int>::const_iterator it;//只能读//2迭代器访问容器元素 st原创 2021-03-23 21:57:42 · 280 阅读 · 0 评论 -
C++---size_t,size_type
1、std::size_t可以存储目标平台下任何类型(包括数组)的最大size,为非负数。sizeof()的返回类型为size_t,通常用于数组索引和循环计数。2、std::size_t在64位系统定义为unsigned long或者unsigned long long,在32位定义为unsigned int(这样当在32位运行64位的代码时,不必更改,size_t自动重定义,方便代码移植,这也是为什么使用size_t而不用unsigned int,unsigned long的原因,或者说size_t存在原创 2021-03-23 21:07:40 · 378 阅读 · 0 评论 -
Ubuntu18.04配置ceres库
ceres被广泛用于解决最小二乘问题,最小二乘分为线性最小二乘和非线性最小二乘,其对应的数值解决方法通常为梯度法、直接法和梯度方法、牛顿法、高斯牛顿法、LM算法,可以参考之前的博客。1下载可以在github官方下载(官方版本会和eigen3(3.3.7)有冲突,编译时会报错),我选择了按照slam14讲第二版里面的方法,因此这里在高博git下载。2安装2.1按照slam14讲打开终端输入sudo apt-get install liblapack-dev libsuitespars原创 2021-01-22 12:05:41 · 1010 阅读 · 0 评论 -
C++类组合及其构造函数
多用组合少继承,若有多态用继承否则尽量使用组合原创 2021-01-03 10:49:28 · 1114 阅读 · 0 评论 -
C++类继承时的构造函数(1)
作者:机器学习入坑者链接:https://zhuanlan.zhihu.com/p/106920426C++中,子类继承父类除去构造函数和析构函数以外的所有成员。因此,子类需要编写自己的构造函数和析构函数。 需要注意的是,子类只负责对新增的成员进行初始化和扫尾编写构造和析构函数,父类成员的初始化和扫尾工作由父类的构造函数和析构函数完成。 无论何种类型的继承方式,子类都无权访问父类的所有成员,所以子类对父类的初始化需要父类的构造函数完成。此时,子类的构造函数必须提供父类构造函数所需的参转载 2020-12-22 20:42:16 · 605 阅读 · 0 评论 -
C++静态成员变量和静态成员函数的使用方法总结
静态成员变量、函数遇到的两个问题:如果在类中调用问题1:std::sort(p1,p2,p3);//原则上可以对任意维度的容器进行降序或升序排列`//例如根据二维向量的第二列降序排列std::vector<std::vector<int>> s;bool CMP(std::vector&a,std::vector&b){return a[0]>b[0];}std::sort(s.cbegin(),s.cend(),CMP);//在main转载 2020-12-11 20:38:19 · 555 阅读 · 0 评论 -
PCL中kdtree心得
1pclkdtree搜索的两种方式//第一种方式pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);//第二种方式pcl::search::KdTree<pcl::PointXYZ> ::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);2两种方式近邻搜索结果相同:近邻搜索结果都包含查询点,近邻索原创 2020-11-20 22:15:01 · 1024 阅读 · 3 评论 -
C++命名规则
规范的代码是一个优秀程序的必要条件。以下内容来自Google开源项目风格指南:1文件命名文件名要全部小写, 可以包含下划线 () 或连字符 (-), 依照项目的约定. 如果没有约定, 那么 “” 更好.可接受的文件命名示例:my_useful_class.cc2类型命名类型名称的每个单词首字母均大写, 不包含下划线: MyExcitingClass, MyExcitingEnum.所有类型命名 —— 类, 结构体, 类型定义 (typedef), 枚举, 类型模板参数 —— 均使用相同约定,转载 2020-09-24 20:38:02 · 2087 阅读 · 0 评论 -
C++指针小结(1)
自己对C++学的一知半解,对指针真是又爱又恨。。买了本c++ primer,结合书中的内容重新对指针理解理解。1指针的组成声明一个变量,如 int b;则有一个int类型和变量名b组成。推广到一般的声明,定义声明的构成:基本数据类型+声明符。指针是一个复合类型。指的是基于其他类型定义的类型。常见的有引用和指针。声明一个指针int*p;解释如下:int为基本数据类型。*p是声明符。...原创 2019-12-14 21:04:15 · 185 阅读 · 0 评论 -
C++中const修饰函数,函数参数,函数返回值的作用
const修饰函数在类中将成员函数修饰为const表明在该函数体内,不能修改对象的数据成员而且不能调用非const函数。为什么不能调用非const函数?因为非const函数可能修改数据成员,const成员函数是不能修改数据成员的,所以在const成员函数内只能调用const函数。#include using namespace std;class A{private:int i;pu...转载 2019-12-04 16:39:30 · 290 阅读 · 0 评论 -
C++开源库大全
程序员要站在巨人的肩膀上,C++拥有丰富的开源库,这里包括:标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等。标准库• C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分。• Standard Template Library:标准模板库• C POSIX library : POSIX系统的C...转载 2019-11-26 13:23:51 · 538 阅读 · 0 评论