环境管理
C++大型项目的环境管理,最好使用docker创建单独的环境,特别是,在复现别人的代码时,否则会出现兼容性问题,很浪费时间。使用dockerfile,以现有的(如ubuntu镜像为基础),创建镜像环境,可同步配好环境,避免冲突。
-
若需要在docker中使用gpu:要安装对应的nvidia-docker,并在创建docker时进行设置:
-
#创建容器,并添加显示功能 sudo docker run -itd --gpus all --name $name \ -v $(pwd):/Photo-SLAM/gaussian --privileged \ -v /tmp/.X11-unix:/tmp/.X11-unix -v \ /etc/localtime:/etc/localtime:ro -e DISPLAY=:1 \ --device /dev/video0:/dev/video0 photo-slam:full
-
String
substr(i, j): 起始位置为i,长度为j的字符串
String转int:
#string to int
atoi(s)
#char* to int
atoi(s)
#string stream
stringstream stream;
int num; string test="66665";
stream << test;
stream >> num;
切割字符串:
str.substr(0, length);
#length 代表子串长度
查找字符串:
string s;
s.find(char, start_point);
#数一下字符串中有几个字符:
while(start<s.size()){
start=s.find(c, start);
if(start<0) break;
ind++;
start+=1;
//从下一个位置开始
}
输入字符串:
cin>>string
插入字符或字符串:
string str;
str.insert(str.begin(), 'c');
//
str.insert(0, "fff", 2);
//在0位置插入"fff"的前两个字符
//擦除字符串,左包右不包
str.erase(pointer_s, pointer_end);
断言语句:
assert(条件);
指针
对指针直接赋值无法改变指针原来指向的位置:
T* A = Tree->left;
A = NULL;
#此时Tree->left并没有改变
#如果想改变Tree->left,应当使用指针的引用
指针被delete后不应该再访问了,应当顺便赋予NULL,否则判断时,他是一个野指针,但无法访问。
排序
sort:
sort(iter_begin, iter_end, [](param a, parma b){return true or false;}
//true a 在前, false b在前
遍历文件
#include <boost/filesystem.hpp>
fs->
for(const auto & file : fs::directory_iterator(dir)){
if(fs::is_regular_file(file) && file.path().extention()==".xxx")
XXXX;
}
//注意,在.h文件中使用似乎无效
线程
detach:主线程与子线程分离,主线程直接结束(子线程同时被销毁)
join:主线程阻塞等待子线程完成
编译报错:pthread库未定义,则在target_link_libraryes后面加上pthread
静态库与动态库
静态库的扩展名一般为“.a”或“.lib”;动态库的扩展名一般为“.so”或“.dll”
静态库(lib[library_name].a):在链接阶段,会将汇编生成的目标文件.o与引用的库一起打包到可执行文件中,程序在运行时与函数库再无瓜葛,移植方便,
但是浪费资源。如果静态库liba.lib更新了,使用它的应用程序需要重新编译
动态库与静态库创建方法:
CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(MyLibrary)
# 设置库的源文件
set(SOURCE_FILES my_function.cpp)
# 生成动态库
add_library(my_library_shared SHARED ${SOURCE_FILES})
# 生成静态库
add_library(my_library_static STATIC ${SOURCE_FILES})
# 设置库的安装路径
install(TARGETS my_library_shared DESTINATION /path/to/installation)
install(TARGETS my_library_static DESTINATION /path/to/installation)
# 设置库的头文件路径,以便其他程序可以包含它们
set(HEADERS my_function.h)
# /path/to/installation/include为绝对路径,可用CMAKE_CURRENT_SOURCE_DIR获得当前CMAKELIST路径
install(FILES ${HEADERS} DESTINATION /path/to/installation/include)
动态库与静态库连接方法:
# 设置动态库的路径
set(MY_LIBRARY_PATH "/path/to/your/dynamic/library")
# 查找动态库文件
find_library(MY_LIBRARY my_library_shared PATHS ${MY_LIBRARY_PATH})
if(NOT MY_LIBRARY)
message(FATAL_ERROR "无法找到动态库文件")
endif()
# 添加可执行文件
add_executable(my_app main.cpp)
# 链接动态库
target_link_libraries(my_app PRIVATE ${MY_LIBRARY})
动态库(libxxx.so)与静态库的创建方法:链接 库的链接方法
大量加和导致精度溢出:
使用long或long long
非递减数列剪枝
//求和操作,寻找非递减数列nums中加和为t的组合
//常采用如下剪枝操作
if(nums[i]>=0&&nums[i]>t) return XX;
//注意这里的前提是nums[i]为非负数,否则可能越加越小
无符号数减法溢出问题
size_t 如果为0,再做减法,则不会是负数,而是会变成一个大的整数;