C++ STL八股文
Vector vector的底层实现⭐ C++ 标准库中的 std::vector 是一个动态数组,底层通过连续内存块实现,支持快速随机访问和动态扩容。其核心实现细节如下: 1. 底层数据结构 vector 内部维护三个指针(或等效的成员变量)来管理内存: _start:指向数组的第一个元素(begin())。 _finish:指向最后一个元素的下一个位置(end())。 _end_of_storage:指向内存块的末尾(表示当前分配的容量上限)。 12345678template <class T>class vector {private: T* _start; // 指向第一个元素 T* _finish; // 指向最后一个元素的下一个位置 T* _end_of_storage; // 指向内存块的末尾 // ...}; 2. 内存分配与扩容 初始化 默认构造时,vector 为空,三个指针均为 nullptr。 添加元素时,若当前容量不足,触发动态扩容。 扩容机制 当...
C++面试八股文--参考C++ Primer目录
第 1 章 C++ 基础 主要内容:基本类型、字符串、向量和数组、表达式、语句、函数(缺省函数、函数重载、内联函数)、引用。 结构体的对齐规则 结构体的对齐规则。 一、结构体对齐规则首先要看有没有用#pragma pack宏声明,这个宏可以改变对齐规则。在没有#pragma pack这个宏的声明下,遵循下面三个原则: 1、第一个成员的首地址为0。 2、每个成员的首地址是自身大小的整数倍。 3、结构体的总大小,为最大成员的整数倍。 二、当用 #pragma pack(n)指定时,以 n和最大成员...
C++ STL常用函数——leetcode刷题
STL常用容器 容器分类 顺序(序列式)容器: vector:采用线性连续空间,类似于数组; deque:双向开口的连续线性空间,随机存取,双端队列; list:双向循环链表; slist:单向链表; array:固定数组,vector的底层即为 array数组。 关联式容器: set(集合)和 map(映射):都是以红黑树作为底层结构。set不可重复,mutliset可重复;map不可重复,mutlimap可重复; hash_set(unordered_set)和 hash_map(unordered_map):是基于哈希表实现的,查询时间复杂度为O(1)。 容器适配器: stack:以 deque为底部结构并封闭其头端开口形成的; queue:单端队列,由 deque实现; pirority_queue:优先队列,类似于堆,基于 vector容器实现的。 1. string 查找和替换 123int find(const string& str, int pos = 0) const;...
一文了解程序编译cmake命令
CMake快速学习 只有一个源文件的程序编译 首先在当前目录下创建两个文件,源文件hello.cpp和cmake文件CMakeLists.txt; 123456# cmake最低版本要求2.8cmake_minimum_required (VERSION 2.8)# 本项目的工程名project (learn_cmake)# 要生成的可执行文件名为hello,后面的参数是需要的依赖add_executable(hello hello.cpp) 接着在当前目录下执行cmake .; 接着会发现目录下多生成了一些文件,例如Makefile等; 然后使用GNU make来编译程序,即输入make命令; 此时会发现已生成可执行程序,输入./hello就可以正常执行, 同一目录下多个源文件 此时在当前目录新增两个源文件,只需要在CMakeLists.txt中添加所依赖的.cpp文件如add_executable(hello hello.cpp...
一文学习Linux系统下GDB调试
GDB调试命令 如何进入gdb模式 形成可执行程序 在linux下使用gcc/g++、makefile或CMake形成可执行程序时,需要加上-g选项,即程序发布的debug模式;如果不加该选项就默认是release模式; 如果要进入gdb开始调试,那直接gdb + 可执行程序名即可。 GDB操作指令 行号显示(list) l 行号/函数名表示显示包含该行或该函数的10行代码。 l 表示列出该源文件中的随机10行内容; l 0或l 1 表示从从第一行开始往下显示10行的内容; l m 表示显示包含第m行的10行代码; l 函数名 表示显示函数名的前后10行代码; l m,n 表示显示从第m行到第n行的代码。 断点设置(break) b 行号 表示在该行打断点; b 源文件:行号 表示在该源文件中的这行加上一个断点; b 源文件:函数名 表示在该函数的第一行打上断点。 查看断点信息 info 表示查看所有的调试信息; info b 表示查看所有断点的信息; 断点的字段信息: Num —— 编号 Type —— 类型 Disp —— 状态 Enb ——...
一文学习Git基础命令
Git基础命令 安装 在Linux上安装 1sudo apt-get install git 在Windows上安装:下载git程序 安装完设置,在命令行输入 12git config --global user.name "Your Name"git config --global user.email "[email protected]" 创建版本库 创建空目录 123mkdir learngitcd learngitpwd 将目录变成git仓库 1git init 把文件添加到版本库 1234567#1.创建并编写文件touch 文件名vim 文件名#2.暂存文件,将文件放入暂存区。git add 文件名#3.提交更新,找到暂存区的文件,存储到Git仓库。git commit -m "本次提交的说明" 版本回退 查看当前版本状态 要随时掌握工作区的状态,使用git status命令。 如果git status告诉你有文件被修改过,用git diff可以查看修改内容。 版本回退 git...
Linux基础命令
Linux基础命令 ls命令 功能:列出文件夹信息 语法:ls [-l -h -a] [参数] 参数:被查看的文件夹,不提供参数,表示查看当前工作目录 -l,以列表形式查看 -h,配合-l,以更加人性化的方式显示文件大小 -a,显示隐藏文件 pwd命令 功能:展示当前工作目录 语法:pwd cd命令 功能:切换工作目录 语法:cd...
C++的ACM模式输出入
C++常用的输入方法 在C++语言中,标准输入操作需要包含头文件 <iostream>。 1. cin cin可以连续从键盘读取多个数据,直到遇到分隔符(空格、Tab键和换行符)为止。 2. getline() 当我们需要读取包含空格的字符串时,cin读不全整个字符串。此时,可以使用getline()函数来解决问题。 使用getline()函数时,需要包含头文件<string>。getline()函数会读取整行内容,包括空格字符,直到遇到换行符为止。 函数原型:getline(istream& is, string& str, char delim); (1)is是输入流,这里是 cin,表示从标准输入流中读取数据。 (2)str是存储读取结果的字符串。 (3)delim是分隔符,即当读取到这个字符时,getline函数停止读取。 getline(cin,s);没有提供第三个参数(分隔符),以此该句的作用是从标准输入中读取一行文本,将其存储在字符串...
Python的ACM模式输出入
输入 1. 单行输入多个整数 12nums = list(map(int, input().split()))print(sum(nums)) 2.多行输入(行数n未知) 12345678910111213# 方法1while True: try: nums = list(map(int, input().split())) print(sum(nums)) except EOFError: break# 方法2import sysfor line in sys.stdin: nums = list(map(int, line.split())) print(sum(nums)) 3.多行输入(行数n已知) 1234t = int(input())for _ in range(t): nums = list(map(int, input().split())) print(sum(nums)) 4. 多个测试用例,每个测试用例包含多行数据 123456t = int(input())for _ in...
常用设计模式讲解
单例设计模式 ⭐ 定义 单例模式是一种创建型设计模式,它的核心思想是保证一个类只有一个实例,并提供一个全局访问点来访问这个实例。 优点 1.全局控制:保证只有一个实例,这样就可以严格的控制客户怎样访问它以及何时访问它,简单的说就是对唯一实例的受控访问。 2. 节省资源:也正是因为只有一个实例存在,就避免多次创建了相同的对象,从而节省了系统资源,而且多个模块还可以通过单例实例共享数据。 3. 懒加载:单例模式可以实现懒加载,只有在需要时才进行实例化,这无疑会提高程序的性能。 基本要求(规则) 私有的构造函数:防止外部代码直接创建类的实例。 私有的静态实例变量:保存该类的唯一实例。 公有的静态方法:通过公有的静态方法来获取类的实例。 种类 饿汉模式 不管是否需要使用这个实例,直接先创建好实例,然后当需要使用的时候,直接调方法就可以使用了。 1234567891011121314151617class Singleton{private: // 静态成员变量在类加载时初始化 static Singleton...