C++笔记

环境管理

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,再做减法,则不会是负数,而是会变成一个大的整数;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值