
string取子串取长度为3的子串ss_elem ss.substr(0, 3)转换int转stringint与string互转拷贝将字符串的一部分拷贝到另一个字符串string类可以使用构造函数string(const string str,string size_type pos0,size_type nnpos)替换C string字符串修改和替换方法详解其中一种使用方法basic_string replace (size_type p0, size_type n0, const E *s, size_type n); //使用字符串 s 中的 n 个字符从源串的位置 P0 处开始替换 1 个字符std::string(“my name is Lion”, 5)意思是取字符串的前5位来构造一个字符串类型获取线程、进程ID#include unistd.h #include sys/syscall.h #define gettid() syscall(SYS_gettid) // 获取进程ID getpid() // 获取线程ID gettid()传值与传址C 传参时传内置类型时用传值(pass by value)方式效率较高这里汇编代码的主要区别如下// 传值00F343EE mov eax,dword ptr//直接将i的值取出来给eax00F343F1 add eax,1//eax100F343F4 mov dword ptr[r],eax/// 传址00F3449E mov eax,dword ptr// 跟传指针一样取i的地址到eax00F344A1 mov ecx,dword ptr[eax]// 将eax的值取出来 放到ecx中00F344A3 add ecx,1// ecx值100F344A6 mov dword ptr[r],ecx对于汇编代码里的[]说明如下在汇编中[]的作用不是单纯的c语言中指针类似,可以分为两种情况。1.对于变量来说[var]和var作用是一样的。2.对于寄存器来说就有区别了,[eax]是eax的地址(这里是c语言中的指针) 而不加中括号的eax就是c语言中的变量值了对于拥有内置类型的STL来说汇编代码相差不大intff(conststd::vectorinti){autosum0;for(autoii:i){sumii;}returnsum;}// 反汇编只截取主要差异部分mov eax,dword ptr[i]mov dword ptr[ebp-20h],eax lea eax,[ebp-34h]push eax mov ecx,dword ptrintff(std::vectorinti){autosum0;for(autoii:i){sumii;}returnsum;}// 反汇编lea eax,[i]mov dword ptr[ebp-20h],eax lea eax,[ebp-34h]push eax mov ecx,dword ptr抽象类转载自C学习-抽象类C抽象类是为子类抽象一个基类抽象类的主要作用是为子类提供相同的属性和方法其他如果需要在子类中修改方法需要将其声明为纯虚函数。含有一个及以上纯虚函数的类为抽象类需要注意:抽象类虽然不能创建自己的对象但是可以有自己的指针classcontroller{public:controller();voidfunc()0;// 纯虚函数意味着这是一个抽象类protected:intx;inty;};intmain(){controller MPCController;//错误抽象类不能有自己的对象controller*p_controller;//正确抽象类可以有自己的指针}虽然抽象类创建了一个抽象类指针但是该指针依然不能指向自己只能用来动态的指向子类对象。1如果子类中没有实现纯虚函数而只是继承基类的纯虚函数则这个子类仍然还是一个抽象类。2如果子类中给出了基类纯虚函数的实现则该子类就不再是抽象类可以建立对象。Placement new/deleteC “让new操作符不分配内存只调用构造函数”#includeiostream#includenewclassTest{public:Test(){std::coutConstructorstd::endl;};~Test(){std::coutDestructorstd::endl;}private:charmA;charmB;};char*gMemoryCache(char*)malloc(sizeof(Test));intmain(){{Test*testnew(gMemoryCache)Test();}{Test*testnew(gMemoryCache)Test();test-~Test();}}输出 Constructor Constructor Destructor 和其他普通的new不同的是它在括号里多了另外一个参数。比如 Widget*pnewWidget;---------//ordinary newpinew(ptr)int;pinew(ptr)int;//placement newC 中为什么没有placement deletePoint*pnew(arena)Point;// do something// manipulate a new objectdeletep;// Wrong. You release the arena memorypnew(arena)Point;// correct methodp-~P();pnew(arena)Point;友元参考材料#C11及以上std::filesystem::path用于处理路径支持跨平台可用于路径拼接namespace fsstd::filesystem const fs::path base_path(/home/my_dir); const fs::path sub_dir(subdir1); fs::path full_pathbase_path / sub_dir;std::error_code用于处理异常一般和上边的fs::path一起用std::filesystem::directory_iterator标准库中用来遍历单个目录中所有文件和子目录的迭代器。#include iostream #include filesystem namespace fs std::filesystem; int main() { fs::path target_dir ./dataset/images; // 假设这是你的数据集目录 if (!fs::exists(target_dir) || !fs::is_directory(target_dir)) { std::cerr 目标目录不存在或不是文件夹 std::endl; return -1; } // 直接使用范围 for 循环遍历 for (const auto entry : fs::directory_iterator(target_dir)) { // entry 的类型是 fs::directory_entry std::cout entry.path().filename() std::endl; } return 0; }nullptr0x0nullptr这个值是true。nullptr 是 C11 引入的类型安全的空指针拥有专属的类型 std::nullptr_t。当把 0x0 和 nullptr 放在 两端比较时C 编译器会将空指针常量 0x0 隐式视为指针类型两者在语义上都指向同一状态——“空”因此判断结果完全相等。结构化绑定结构化绑定Structured Binding是 C17 引入的一项极其重要的语法特性。它的核心作用是允许你用一条语句将一个由多个元素组成的复合对象如数组、结构体、元组等“解包”或“拆解”成多个独立的变量。在此之前如果你想从一个复合类型中取出多个值通常需要定义多个单独的变量然后逐一赋值代码显得冗长且不够优雅。结构化绑定直接解决了这个痛点。一、 基本语法结构化绑定的标准语法格式如下 // cv-auto 可以是 auto, const auto, auto, const auto, auto等 cv-auto[变量名1, 变量名2,...]复合对象;二、 它能解包哪些数据类型结构化绑定不仅能处理我们之前聊到的 std::pair它主要支持以下三大类数据结构原生数组 (C-style Arrays)可以直接将数组里的元素绑定到具名变量上。数组的长度必须与方括号 [] 中声明的变量数量完全一致。int arr[3] {10, 20, 30}; // x 10, y 20, z 30 auto [x, y, z] arr;简单的结构体或类聚合体如果一个结构体或类中所有的非静态数据成员都是 public 的且都在同一个基类或当前类中你可以直接解包它的成员。struct Point { double x; double y; double z; }; Point p {1.5, 2.5, 3.5}; // 直接解包出 px, py, pz按成员在结构体中声明的顺序绑定 auto [px, py, pz] p;类似元组的对象 (Tuple-like Types)这包括 std::pair、std::tuple 以及 std::array。#include tuple #include string std::tupleint, std::string, double get_data() { return {404, Not Found, 0.0}; } // 极其优雅的接收方式 auto [code, message, value] get_data();经典实战例子遍历 std::map在 C17 之前遍历 map 必须用 it.first 和 it.secondfor (const auto kv : my_map) { std::cout kv.first : kv.second std::endl; }有了结构化绑定代码变得自带注释效果语义清晰明确for (const auto [key, value] : my_map) { std::cout key : value std::endl; }智能指针在 C 中std::unique_ptr自 C11 引入是最常用、最推荐的智能指针。它的核心定义是独占所有权Exclusive Ownership——在任何给定的时间点只能有一个 std::unique_ptr 指向同一个特定的动态分配资源。与 std::shared_ptr 不同std::unique_ptr 的底层实现了零运行时开销Zero-cost Abstraction。它内部没有复杂的引用计数控制块其大小通常和传统的原生裸指针Raw Pointer完全一样。一旦它超出作用域被销毁它所管理的资源就会被自动释放彻底杜绝了内存泄漏。详细的要进行实践