C艹
文章平均质量分 50
海滩油炸
G_Roboter | Slam
展开
-
每日一问:C++拷贝构造函数和赋值构造函数有什么区别?
构造函数和赋值操作符重载函数的区别原创 2023-03-02 07:09:14 · 919 阅读 · 0 评论 -
ESKF的优点
ESKF的优点描述原创 2022-10-04 11:19:17 · 604 阅读 · 1 评论 -
ORB-SLAM2局部建图线程
ORB SLAM2 Localmapping线程原创 2022-09-14 07:56:28 · 596 阅读 · 0 评论 -
RootBA源码解读4 —— 结果统计与输出
本文主要介绍rootBA代码中的数据统计及输出工作原创 2022-06-12 11:10:27 · 921 阅读 · 0 评论 -
RootBA源码解读2—问题构建
rootba问题构建信息载入原创 2022-06-05 10:26:13 · 270 阅读 · 0 评论 -
RootBA源码解读1—接口设计
rootBA代码解析1--接口设计原创 2022-06-05 09:01:09 · 329 阅读 · 0 评论 -
No CMAKE_CXX_COMPILER could be found. 错误解决
由于项目借助cmake进行编译时,需要升级g++,所以就安装了新版本,一阵操作猛如虎,结果cmake直接告诉我CMake Error at CMakeLists.txt:7 (project): No CMAKE_CXX_COMPILER could be found. Tell CMake where to find the compiler by setting either the environment variable "CXX" or the CMake cache entr原创 2022-04-04 16:45:59 · 32843 阅读 · 4 评论 -
Qt(C++)入门学习
本文适用于在c++ cmake项目中使用qt,需要快速入门的同学。原创 2022-03-13 16:01:51 · 8199 阅读 · 0 评论 -
c++学习 关联容器 map multimap
关于[](中括号)和at的区别,如果at访问的元素不存在,程序将会报错.[]则不会有这种情况.map用中括号访问不存在的元素key,那么会在树中插入一个key/value, value将用default constructor构造不可行的用法! 尽管3作为key可能存在,也可能不存在,(只有运行时才能确定),但是在编译期,为了保险起见,因为传入的是const,所以不会允许map类型对象中括号访问,从而避免潜在的修改map的风险multiset, multimap本质也...原创 2021-08-01 04:37:03 · 316 阅读 · 0 评论 -
Coursera深度学习 Linear classification
介绍线性分类和损失函数损失函数更合理的损失函数利用损失函数得到sample被分到每一类对应的可能性问题:What is softmax?What is cross-entropy?原创 2021-12-29 17:30:58 · 734 阅读 · 0 评论 -
C++ 11.2 Lambda表达式
参数与函数体与返回类型Lambda最终目的:建立一个可调用对象例:int main(){ auto x = [](int val){return val>3;}; //指定返回类型 //auto x = [](int val) -> float{return val>3;}; std::cout<<x(5)<<std::endl;}lambda的本质是生成一个类。。。Lambda的...原创 2021-12-16 14:59:06 · 982 阅读 · 0 评论 -
C++ 15.1 元编程的引入
C++为什么快?因为在编译期可以进行处理优化原创 2021-12-16 14:58:11 · 965 阅读 · 0 评论 -
14.4 模版--消除歧义
引入typename消除歧义(区分 乘法和指针)变量模版原创 2021-12-15 15:00:28 · 102 阅读 · 0 评论 -
C++ 14.4 包展开与折叠表达式
包展开的应用:递归调用实现连续打印实现累加原创 2021-12-13 15:39:45 · 528 阅读 · 0 评论 -
C++ 14.4 完美转发
模版中的T对应的左右值引用传参失效,都变成了左值引用的调用,这时候就需要使用完美转发了。更换为万能应用,结果一样。。。。右值引用的变量是左值,在被g()调用时,变量被认为是左值.std::forward 是一个模版函数,可以实现完美转发。通常能和万能引用结合使用同时处理传入参数是左值或者右值的情况和变长模版结合...原创 2021-12-14 21:37:16 · 520 阅读 · 0 评论 -
C++20 新概念 concepts
为模版类引入约束也可以直接替换typename原创 2021-12-12 15:57:38 · 361 阅读 · 0 评论 -
C++ static member variable 用法
参考文献:What is Static Member Function in C++?1. static member variable 不需要依赖类的实例而存在2. static member variable 可以作为类的实例的计数器(见链接例子)3. static member variable 要满足全局而不只是翻译单元的一处定义原则,所以,一般定义在cpp,或者声明为inline...原创 2021-12-12 09:47:48 · 528 阅读 · 0 评论 -
14.2 类模板与成员函数模板
我们可以在不同的翻译单元引入相同的类模板定义,但是不能在相同的翻译单元引入相同的类模板定义类模板当中的成员函数如果没有在实例化后没有对应的实现,只要不被调用,也没有关系。为什么有时候需要把函数的定义放在外面?因为如果把定义都放在类的定义内部,有时候会显得比较“臃肿”。模板函数的类外定义相对复杂,如下图所示,所以建议还是类内定义最经典的类模板 vector_gcc源码可以声明一个函数模板为一个类的友元类模板的实例化,特化与实例推导类模...原创 2021-11-26 16:40:38 · 407 阅读 · 0 评论 -
14.1 函数模板
模板形参要在编译期赋予相应的实参,编译器根据相应的实参构造出相应的函数。编译期的两步处理语法检查 (比如少没少括号) 实例化检查,生成的实例类型是否可以执行模板定义的操作。会触发编译失败模板只要求翻译单元级别的一处定义原则,而不是程序级别的一处定义原则。inline也设置为翻译单元一处定义原则的原因是因为:要确保它在编译时在所有被调用的地方都可以展开。...原创 2021-11-18 18:27:37 · 234 阅读 · 0 评论 -
C++13.3 类的继承 - 补充知识
public, protected 和private继承的区别protected, private 继承基本不用!用using更改对象权限注意:基类的private成员变量在派生类不能被修改,因为不可见。但是无法改变构造函数的访问权限继承与友元的关系派生类中定义的友元不能访问基类的对象。但是,基类定义的派生类的友元可以work,但是只能访问基类中定义的成员变量。...原创 2021-11-14 13:03:55 · 528 阅读 · 0 评论 -
C++ 13.2虚函数
类的继承中非常重要的概念。什么样的函数可以声明为虚函数?除了静态函数和构造函数外,其他函数可以声明为虚函数。虚函数会引入vtable的结构 ,也就是动态l类型的信息==> polymorphic什么是v table?找到几个说的比较好的链接Understandig Virtual Tables in C++ | Pablo Ariashttps://pabloariasal.github.io/2017/06/10/understanding-virtual-tables/1.原创 2021-11-13 05:13:48 · 356 阅读 · 0 评论 -
C++13.2 类的继承
公有继承 & 私有继承 & 保护继承公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有和保护成员来访问。保护继承(protected): 当一个类派生自保护基类时,基类的公有和保护成员将成为派生类的保护成员。私有继承(private):当一个类派生自私有基类时,基类的公有和保护成员将成为派生类的私有成员。静态类型&动态类型...原创 2021-11-11 07:52:51 · 885 阅读 · 0 评论 -
lvalues and rvalues in C++
参考链接:油管lvalue: something always on the left side. lvalue always has some storage back in them.rvalue: something always on the right side. tempoary variable, which doesn't have location.You can only take a lvalue reference(one ampersand) from a left v原创 2021-11-09 04:50:52 · 565 阅读 · 0 评论 -
C++ 13.1 运算符重载
动机:x+y 的写法比 add(x,y)的写法更加简洁但是编译器并不能理解把“+”应用到任意两对象上。Str Add(Str x, Str y){ Str z; z.val = x.val+y.val; return z;}auto operator + (Str x, Str y){ Str z; z.val = x.val + y.val; return z;}在运算符重载的过程中,我们可以把运算符重载为成员函数或者..原创 2021-11-09 02:06:15 · 725 阅读 · 0 评论 -
C++ 12.4.1 字面值类,成员指针与bind交互
字面值类:回顾:编译期常量:constexpr int a =3;字面值类需要满足其数据成员都是字面值类型,比如字面值类不能够包含string。对于一个类的构造函数,如果没有声明为constexpr,那么编译器会认为它是在运行期构造。利用下面的代码就可以声明为编译器常量的类。必须要使用平凡的析构函数,或者说不能够人工定义析构函数,否则析构在运行期执行,编译器将会对类声明编译期常量感到困惑。成员指针...原创 2021-11-05 04:14:46 · 394 阅读 · 0 评论 -
C++ 12.4.4 构造,析构与复制成员函数
下图中ptr开辟的内存会在main函数结束时被销毁,因为我们在析构函数中进行了delete,从而避免了内存泄漏。另一个对象进行拷贝构造的时候,调用了系统默认的拷贝构造函数。成员变量ptr指向了同一块内存,会造成问题。解决方案:自己定义新的拷贝构造函数和拷贝赋值函数。为了提升效率,也有必要定义移动构造函数。参考资料: c++各标准文档 链接https://en.cppreference.com/w/cpp/links...原创 2021-11-05 04:12:19 · 301 阅读 · 0 评论 -
C++ 12.4.3 构造,析构与复制成员函数
拷贝赋值与移动赋值函数赋值的过程会调用移动赋值或者拷贝赋值。赋值不能引入初始化列表,因为成员都已经完成初始化了。拷贝赋值为了保证连等等逻辑正常,通常我们会返回引用。如果不返回引用,系统需要构造临时对象,从而更加耗费资源。移动赋值考虑到对自身移动赋值时的情况比如m = std::move(m);析构函数目的:释放资源;实现对于对象生存期的精确控制不需要提供参数。在析构函数被调用完后会实现内存回收。如果显式的进行内存管理,就必须显式的...原创 2021-11-02 16:17:53 · 127 阅读 · 0 评论 -
C++ 12.4.2 构造,析构与复制函数
单一参数构造函数单一构造函数可以实现隐式类型转换但是,有些情况我们不希望发生隐式类型转换。因为这会造成一些错误的语法的兼容。显式的初始化可以避免隐式类型转换。用static_cast也可以实现显式的类型转换。拷贝构造函数什么是拷贝构造函数?接收一个当前类对象的构造函数拷贝构造函数如果进行传值而不是传引用,可能会陷入一种无限递归。拷贝构造函数不希望对拷贝的值进行修改。移动构造函数目的:进一步提升系统性能场景:把旧对象...原创 2021-11-02 14:46:15 · 98 阅读 · 0 评论 -
C++ 7.3 内联函数
调用函数时,函数的栈帧需要构造和销毁 【参考链接】如果函数本身比较简单,那么调用栈帧时,相对于函数本身运行的实现,栈帧处理的时间过长,因此性能不好。如果我们想封装简单函数(避免代码重复),并且保持性能, 该怎么办?使用内联函数 inline本节内容其他介绍 链接https://blog.csdn.net/m0_47096428/article/details/120904619...原创 2021-10-22 14:23:15 · 94 阅读 · 0 评论 -
C++常见报错:“Multiple definition of xxx”
错误学名:重定义报错信息:编译没有问题,但是在链接过程中,编译器发现了一个函数有多次定义。可能造成的原因,函数定义在头文件,头文件被多个CPP使用。解决方式:把函数设置为inlineinline void fun()//添加inline前缀{ std::cout<<"Hello "<<std::endl;}在链接的过程中,C++标准规定,如果一个函数被定义成了inline,定义出现多次,并且每次出现的逻辑都是一样的,将不会报错。比如一个.原创 2021-10-22 14:22:17 · 1416 阅读 · 0 评论 -
C++ 12.4 构造,析构与复制成员函数
构造函数可以用不同的参数列表,接受不同的参数,从而形成重载。引入缺省实参代理构造函数问题: Str初始化的时候,终端打印出来是“here1”和“here2”的顺序分别是什么?代理构造函数会被先执行,然后再执行原始构造函数的设置。初始化列表初始化和赋值的区别初始化会开辟新的空间给变量,赋值只会修改空间对应的值x将会在被初始化的时候直接赋值成为val,如果不使用初始化列表,将会被缺省初始化,然后再赋值,效率较低。当在初始化...原创 2021-10-17 16:59:12 · 190 阅读 · 0 评论 -
c++实现矩阵乘法
之前一直对于c++实现矩阵乘法保持敬畏....因为没有自己写过,今天动手实践了一波.感觉对于vector初始化的方式是一个重点vector<datatype>(5,0);除此之外,就是一坨坨的for循环#include <iostream>#include <vector>using namespace std;int main(){ int rowA, colA, colB; int& rowB = colA;//[r原创 2021-07-03 05:01:46 · 418 阅读 · 0 评论 -
C++12.3 访问限定符与友元
public / private / protected类的缺省访问:默认为Private; Struct的缺省访问:默认为Public封装友元:可以引用其他类私有的成员函数例一: 把main函数作为友元,记住在最开始有main的声明例二:类作为友元慎用友元:把你的成员都暴露给你的朋友了,不够安全,违背封装的理念。 友类不是相互的一种关系,比如上面的例子,Str2被声明为Str的友元,Str2可以访问Str的成员,但是Str不能访问Str2的成员。类...原创 2021-10-16 06:51:15 · 193 阅读 · 0 评论 -
C++ 类:静态数据成员
类外定义静态成员,如果没有定义,编译会通过,但是链接会出错,因为系统无法找到定义。从C++98开始,const成员可以类内初始化,作为编译期常量,有点类似于constexpr的功能原创 2021-10-01 18:15:09 · 83 阅读 · 0 评论 -
c++ 12.2 成员函数
成员函数/方法 是一种抽象的数据类型。在执行类外定义时,类外定义的方法将不具有内联性质,如果你希望恢复内联性质,那么你就需要添加inline前缀。编译器的两遍处理:对于类内的函数声明和数据成员进行一遍遍历,第二遍再处理函数中的实际逻辑。注意,这种情况依然会失效。tail returning type...原创 2021-09-28 14:48:22 · 141 阅读 · 0 评论 -
C++基础--类--结构体与对象聚合
从面向过程到面向对象struct的定义结束后,需要加上;如果对struct只进行声明,那么称为不完全类型(variable has incomplete type),因为你不知道它对应的内存等信息。一处定义原则:struct的对应翻译单元级别,意味着一个cpp文件可以定义一个struct。结构体的定义包括其数据成员的声明。注意:现在不能使用auto对于数据成员进行声明。聚合初始化:struct进行聚合初始化时,如果结构体成员顺序改变,或者增加,那么初始化将出现错误。在聚合..原创 2021-09-17 16:55:46 · 1672 阅读 · 0 评论 -
C++自加自减运算符
++a --a 前缀自增自减运算法 ==》 前缀返回左值,返回a变化之后的值;步骤:成员变量自增或自减; 返回对象引用;a++ a-- 后缀自增自减运算法 ==》 返回a变化之后的值;后缀时返回右值. 在这期间构造临时变量,将原始值拷贝到临时变量,进行操作步骤先要产生一个临时对象来保存未自增或自减前的对象; 接着成员变量自增或自减; 最后返回修改前的对象;某大厂面试题我们想实现一个计数器函数,请说一下下面代码的潜在问题#include <iostream..原创 2021-09-17 16:51:04 · 352 阅读 · 0 评论 -
c++学习unordered_set/unordered_map
c++中的有序排列通过红黑树实现,比如set map,无序排列由hash map实现,但是由于hash map的名称在c+11前已经被其他第三方库使用,所以,c++11采用了unordered_map这个诡异的名字.unordered_set/map查找性能比map/set要好,使用哈希表可以实现 ,参考链接https://cxyzjd.com/article/I_ren/107671207哈希表介绍:https://www.youtube.com/watch?v=shs0KM3wKv8..原创 2021-08-05 05:48:57 · 238 阅读 · 0 评论