C++
zeeq_
A WHU LIESMARSer
展开
-
linux下使用vscode进行c++项目开发,CMakeLists.txt、launch.json、tasks.json联合配置需要注意的地方
使用这三者配合,可以实现自动化的运行和调试,如下是三个文件的内容,只要目录结构是。的,那么launch.json和tasks.json则可以直接copy过去使用。其中,launch.json、tasks.json中的。则表示当前打开目录的名字。表示vscode当前打开的目录路径,而。原创 2023-02-26 18:22:13 · 1204 阅读 · 0 评论 -
linux下使用vscode和cmake高效管理c++项目简明教程
linux系统下vscode和cmake高效管理c++项目原创 2023-02-26 17:33:36 · 1534 阅读 · 0 评论 -
增量式SfM详细流程介绍及实现方法
目前主流的SfM(Structure from Motion,运动结构恢复)可以分为两大类型,一种是全局式的,一种是增量式的。全局式sfm能够一次性得出所有的相机姿态和场景点结构。它通常先求得所有相机的位姿,然后再通过三角化获得场景点。其效率较高,但是其鲁棒性差,很容易受到outlier的影响而导致重建失败。增量式sfm则是一边三角化(triangulation)和pnp(perspective-n-points),一边进行局部BA。这类方法在每次添加图像后都要进行一次BA,效率较低,而且由于误差累积,容易原创 2020-12-12 22:24:28 · 16811 阅读 · 22 评论 -
增量式sfm寻找下一最 佳匹配、获取pnp对应点、新加入图像三角化的trick
由于这些trick不太方便用流程图表达(涉及到的变量比较多),因此我直接用文本的形式,然后把一些变量用字母代替了。具体实现细节比较复杂,如果你也刚好在写这些trick,那么也许你可以从下图中获得启发或者修正自己的思路。如下:......原创 2020-12-12 21:02:10 · 2179 阅读 · 0 评论 -
c++多维vector不同的初始化分配空间方法及效率对比分析
#include <iostream>#include <vector>#include <time.h>using namespace std;//法一:自己写for循环进行初始化分配空间void Init1(int m, int n) { vector<vector<int>> test; test.resize(m); for (int i = 0; i < m; i++) { test[i].resize(n);原创 2021-08-21 23:11:28 · 1282 阅读 · 0 评论 -
c++容器map、unordered_map、multimap的增删改查使用方法详解(示例)
1. unordered_map代码:#include <iostream>#include <string>#include <unordered_map>using namespace std;int main() { unordered_map<string, int> votes; //插入 votes["小明"]++; //直接添加(值为int类型时才这么用) votes["李华"]++; //当不存在该key时,原创 2021-08-19 22:16:26 · 4040 阅读 · 0 评论 -
linux系统下创建ros工作空间和软件包开发教程
在linux系统下使用ros进行开发,需要首先创建并编译工作空间和软件包,并编辑自己的内容,然后写cmake文件。这里总结了使用命令行创建并编译ros工作空间和软件包的方法,更详细的内容可以参考ros官方中文教程。开发前需要首先安装并配置好ros环境,参考这里。mkdir catkin_ws #创建名为catkin_ws的工作空间目录cd catkin_ws #进入创建好的工作空间目录mkdir src #在工作空间目录下创建src目录cd src #进入创建好的src目原创 2021-07-22 14:19:01 · 1262 阅读 · 1 评论 -
ubuntu开发环境搭建
1. 安装gcc,gdb依次在终端执行如下两行命令:sudo apt update #更新sudo apt install build-essential gdb #安装编译器和调试器测试是否成功安装的方法:gcc --versiong++ --versiongdb --version依次在终端执行上述命令,若输出版本号,则表明安装成功。2. 安装CMake在终端执行如下命令:sudo apt install cmake测试是否安装成功:cmake --versi转载 2021-07-20 13:35:44 · 187 阅读 · 0 评论 -
使用g++编译c++文件的重要参数及编译实例
1 前言VSCode是通过调用GCC编译器来实现C/C++的编译工作的使用 gcc 指令编译 C 代码使用 g++指令编译 C++ 代码2 编译过程预处理-Pre-Processing //.i文件# -E 选项指示编译器仅对输入文件进行预处理g++ -E test.cpp -o test.i //.i文件编译-Compiling // .s文件# -S 编译选项告诉 g++ 在为转载 2021-07-20 13:34:51 · 1928 阅读 · 0 评论 -
ubuntu下使用vscode对c++程序进行自动化调试(设置task.json)
点击vscode顶部菜单栏的终端,然后点击配置默认生成任务...,在弹出的选项中选择第一个即可。之后就会自动生成一个名为task.json的文件。我们修改task.json文件的内容,如下:{ "version": "2.0.0", "options": { "cwd": "${workspaceFolder}/build" //需要进入到我们执行tasks任务的文件夹中 }, "tasks": [ //tasks包含三个小任务 { "type": "shel.原创 2021-07-20 12:29:28 · 6906 阅读 · 2 评论 -
ubuntu下使用vscode对c++程序进行调试的详细图文教程(设置launch.json)
点击scode左侧菜单栏的debug图标,点击创建launch.json文件。2. 弹出的选择环境选项中,选择C++(GDB/LLDB)。3. 再次弹出的选项中选择第一个。4. 可能会弹出一个警告窗口,直接点击中止即可。5. 然后就会自动打开生成的launch.json文件。其中有两个重要的参数,一个是第11行的program,另一个是preLaunchTask。6. 其中,program项需要填入我们需要调试的可执行文件的绝对路径。我这里填入的是${workspaceFolder}/build.原创 2021-07-20 12:28:34 · 13203 阅读 · 3 评论 -
C++遍历文件夹下的所有文件代码
遍历文件夹下的所有pdf文件#include <stdio.h>#include <io.h>#include <string>int main(){ //目标文件夹路径 std::string inPath = "E:\\Users\\lidar\\Desktop\\WindowsProject\\kjtj\\books\\*.pdf"; //遍历文件夹下的所有.pdf文件 //用于查找的句柄 intptr_t handle; struct原创 2021-06-16 17:53:43 · 157 阅读 · 0 评论 -
c++数值(float、double)转string并控制输出的小数位数(精度)
#include <string>#include <iomanip>template <typename T>std::string ccEditWireParametersDlg::to_string_with_fixed_precision(const T in_num, const int pre = 2){ std::ostringstream out_str; out_str << setiosflags(ios::fixed) &l原创 2021-05-18 16:15:15 · 2834 阅读 · 0 评论 -
string转LPCWSTR代码及在vs工程中使用c++调用ShellExecute函数执行外部exe程序代码
string转LPCWSTR代码如下:LPCWSTR ccGenerateReportWorker::string2LPCWSTR(std::string stdstr){ size_t strsize = stdstr.length() + 1; size_t convertedChars = 0; wchar_t *wcstring = (wchar_t *)malloc(sizeof(wchar_t)*(stdstr.length() - 1)); mbstowcs_s(&co原创 2021-05-10 11:13:48 · 330 阅读 · 0 评论 -
c++获取vs工程工作路径的代码
添加头文件#include <direct.h>获取当前路径的代码//获取当前工作路径char buffer[MAX_PATH];getcwd(buffer, MAX_PATH);string curpath = buffer;比如该vs工程的路径为E:\Users\Desktop\windowsproj,运行模式为release,则上述curpath的值为E:\\Users\\Desktop\\windowsproj\\msvc\\x64\\Release如果要获取工程路径原创 2021-05-09 23:05:46 · 1319 阅读 · 0 评论 -
用git merge完别人的工程后,工程下的头文件和cpp文件等的文件夹消失了,所有文件都混合在一起的解决方法
用git merge完别人的工程后,工程下的头文件和cpp文件等的文件夹消失了,所有文件都混合在一起了,如下图所示: 其原因是工程的filters文件出现了冲突,可以查看一下git的merge信息,如下所示: 可以看出,其中的PowerInspection.vcxproj.filters出现了冲突。因此,只要找到这个文件,将里面的冲突解决掉,然后重新加载项目,就可以恢复正常了,如下图所示:...原创 2021-04-28 21:00:48 · 337 阅读 · 0 评论 -
c++更新容器数据的新的方式:使用引用和c++11 for循环新特性
当要使用for循环对一个容器进行遍历,并修改容器内数据的值的时候,一般的做法就是,首先通过size()方法获取到容器内数据的数量,然后循环遍历每个数据,并对容器内的值进行修改。如下示例代码所示:void normalExample(pcl::PointCloud<pcl::PointXYZL>::Ptr pttest) { //以第一个点坐标为偏移量 pcl::PointXYZ offset; offset.x = pttest->at(0).x; offset.y = p原创 2021-04-19 10:50:10 · 2595 阅读 · 0 评论 -
使用liblas库读写las文件c++代码
需要包含的头文件包括//标准c++#include <string>//liblas库#include <liblas/liblas.hpp>#include <liblas/point.hpp>#include <liblas/version.hpp>//pcl库#include <pcl/point_cloud.h>#include <pcl/point_types.h>读las文件bool LasIO::r原创 2021-04-15 11:05:16 · 3224 阅读 · 8 评论 -
无法定位程序输入点,于动态链接库xxx上的可能原因及解决方法
启动自己编译生成的cloudcompare.exe的时候,报错说无法定位程序输入点,如下图所示: 其原因可能有两个,一个是找不到依赖的某些dll,另一个是有些依赖库存在版本冲突。在我这里是由于Qt的版本冲突造成的。因为之前用的是qt5.9.9,而现在使用的是qt5.14.0。解决办法就是,检查一下环境变量里面的依赖库dll路径,看是否混用了,或者看一下使用的dll版本是否正确。......原创 2021-04-12 11:07:07 · 70016 阅读 · 13 评论 -
将cloudcompare插件移动到自己管理的cc工程下需要修改的地方
插件编写教程可以参考这里。但是通过直接修改编写的插件是需要使用cmake进行管理的,而由于cloudcompare源码并不算多,如果我们不想用cmake来管理工程,想直接用vs来管理。那么,插件也需要进行转移,其中需要注意和修改的地方包括:在总的解决方案里面添加一个新建项目,类型为Qt Empty Application,命名与原插件名称保持一致(这样可以减少一些命名方面的更改,更不易出错),如下图所示。直接将插件源码移动到总工程文件夹下是不太可行的,因为自己管理的插件类是Qt类型的。将原插件相原创 2021-04-11 17:37:39 · 286 阅读 · 0 评论 -
vs工程某个宏没有被定义报一堆错误的解决方法(eg. cloudcompare的ScalarType)
在生成项目的时候,报了108个错误,如下图所示: 看到这可能很多人都会直接崩溃了,这么多,怎么改的过来。博主也遇到过好几次一报就是一大堆错误的情况了,比如之前写过的一篇文章新建c++空项目配置教程及使用由vcpkg下载的pcl库时报一大堆错误的解决方法。其实错误多也并不可怕,这里面很多错误都是连带发生的而已,通常只需要将根本问题解决了(一般就是优先解决通用一点的问题),这些错误就会一起消失了。比如上图的108个错误,注意到第一个错误,写着type for ScalarType has not be原创 2021-04-11 13:29:44 · 474 阅读 · 0 评论 -
vs中c++项目的包含目录和库目录配置的两种方式,及无法解析外部符号的解决办法
vs中的c++工程配置中,包含目录和库目录可以在两个地方进行设置,两者效果是一样的。所以有时在转移工程的时候,如果发现在原工程里可以正常运行,而现工程却不行,就可以检查一下附加目录中是否正确进行了设置。VC++目录 - 包含目录 = C/C++ - 常规 - 附加包含目录VC++目录 - 库目录 = 链接器 - 常规 - 附加库目录 此外,当一个解决方案中包含多个工程,且工程直接存在相互引用时,那么,如果出现了无法解析的外部符号这个错误时,通常考虑的问题及解决参考这篇博客。此外,还应原创 2021-04-11 11:54:08 · 8115 阅读 · 3 评论 -
c++使用迭代器iterator对map/unordered_map数据结构进行迭代
//新建以`string`为key,以`vector<int>`为value的map数据结构std::map<std::string, std::vector<int>> name_count;//数据结构的赋值操作for(...)//新建该类型的迭代器std::map<std::string, std::vector<int>>::iterator iter;//对`name_count`从头到尾进行迭代for (iter =原创 2021-04-09 10:09:48 · 1067 阅读 · 0 评论 -
三维点沿指定向量方向到平面的距离计算方法及C++代码实现
设平面外一点为P(p1,p2,p3),指定的方向向量为d=(d1,d2,d3),平面Q方程为Ax+By+Cz=D,其法向量为n=(A,B,C)。则计算点P沿方向向量d到平面Q的距离,可以通过下式计算 (P+t* d)* n=D [1] 其中t为待求的常数。下面将[1]式分两个步骤解释一下该式子的意义(理解了以后其实就很简单): P’ = P+t* d [2] P’ * n=D [3] [2]式表示三维点P沿着方向向量d移动t倍距离,到达点P原创 2020-12-29 21:38:21 · 3062 阅读 · 0 评论 -
向量法计算三维点到平面的距离公式及C++代码实现
点到平面距离公式推导如下图所示,详细信息参见百度百科:https://baike.baidu.com/item/%E7%82%B9%E5%88%B0%E5%B9%B3%E9%9D%A2%E8%B7%9D%E7%A6%BB/10690055?fr=aladdin 该计算方法在C++中的实现代码如下:原创 2020-12-29 21:48:42 · 5018 阅读 · 0 评论 -
c++读取文本文件(txt)代码
这篇博客是一个c++读取txt文件的代码,当然,其他后缀的文本文件啥的读取方法也是一样的,如果是二进制文件那就需要改一下读取模式了。写这篇博客主要是因为有时候会需要简单一个小程序处理一下数据什么的,但是又不常用,需要时候还得查,有点麻烦,所以简单记录一下读写方法及需要include的库。有两段代码,第一段是以string方式读取数据进来的,第二段是以int方式读取数据进来。#include <iostream>#include <fstream>#include <s原创 2021-04-02 22:04:04 · 14166 阅读 · 0 评论 -
C++指针也只能传值?指针传值与传址的实例解析
指针也存在“传值”和“传址”的操作。下面用一小段测试代码及结果来进行说明:bool GetValue(int* var) { int b = 10; var = &b; return true;}int main() { int* a = nullptr; GetValue(a); return 0;} 以上是测试代码,下面是运行结果: 在还没运行GetValue(a);函数的时候,可以看出,a是nullptr类型。 运行进去之后,可以看到GetValue原创 2021-04-07 17:49:58 · 244 阅读 · 0 评论 -
c++ map/unordered_map和vector混合数据结构的赋值插值操作
如下示例和注释所示:原创 2021-04-08 15:58:33 · 1280 阅读 · 0 评论