STL容器学习笔记 (附类比与实例)
STL容器学习笔记 (附类比与实例)导语本文档是我学习 C++ STL(Standard Template Library)中各种容器的笔记总结。为了让这些概念更生动易懂,我将结合一些生活中的类比和具体的代码实例,来帮助理解 STL 容器的底层实现、特性和适用场景。
1. 序列式容器 (Sequence Containers)序列式容器就像一个有序的列表,里面的元素按照它们被添加的顺序排列,我们可以通过它们在列表中的位置来访问它们。
1.1 std::vector - 动态数组 (像一个可伸缩的储物柜)
核心概念: 动态数组,内存连续。
类比: 想象一个储物柜,一开始可能只有几层,但当你需要放更多东西时,它会自动“变大”,增加新的层数来容纳。
底层实现: 单块连续内存,通过三个指针 (_M_start, _M_finish, _M_end_of_storage) 管理。
_M_start: 柜子的起始位置。
_M_finish: 当前已放满物品的柜子位置。
_M_end_of_storage: 柜子总共能容纳物品的末尾位置。
特性:
快速查找 (O(1)): 就像你知道物品在第几层 ...
C++学习笔记——双重指针与二维数组
C++学习笔记:双重指针与二维数组哈喽,同学们!今天我们来聊聊C++里两个听起来有点“绕”但实际很重要的概念:双重指针和二维数组。别担心,我会用最直白的方式,从学生的角度来给大家讲清楚!
一、双重指针(指针的指针)1. 什么是双重指针?我们知道,一个普通指针(比如 int* p)是用来存储一个变量的地址的。那双重指针呢?顾名思义,它就是用来存储指针的地址的!
想象一下,你有一个房间(变量),房间里放着一个纸条,纸条上写着另一个房间的地址(普通指针)。现在,双重指针就是另一个纸条,上面写着你手里这个纸条的地址。是不是有点像“套娃”?
在C++中,我们用两个星号 ** 来声明一个双重指针。
举个例子:
123int a = 10; // 定义一个整型变量 aint* p = &a; // 定义一个指向 a 的指针 p,p 存储 a 的地址int** pp = &p; // 定义一个指向 p 的双重指针 pp,pp 存储 p 的地址
2. 怎么理解双重指针?我们来画个图,帮助大家理解内存中的关系:
123graph TD A[变量 a: 10] ...
C++学习笔记——宏与动态内存
C++宏与动态内存学习笔记引言:宏是什么?宏(Macro)是C/C++预处理器提供的一种文本替换机制。在程序编译之前,预处理器会根据宏定义将代码中的宏名称替换为对应的文本。宏在某些场景下非常有用,但也需要谨慎使用,因为它只是简单的文本替换,可能导致一些意想不到的问题。
1. 宏中的特殊符号宏定义中可以使用一些特殊的符号,它们赋予了宏更强大的功能。
1.1 字符串化操作符(#)
作用:将宏参数转换为一个字符串字面量。
用法:在宏定义中,将#放在参数名前面。
注意事项:
只能用于带参数的宏定义中,且必须置于宏定义体中的参数名前。
#操作符会忽略参数前后的空格。
如果参数中间有多个连续的空格,它们会被压缩成一个单一的空格。
示例与辨析:exp("hello") vs exp1(hello)
假设有以下宏定义:
12#define exp(s) printf("test s is:%s\n",s)#define exp1(s) printf("test s is:%s\n",#s)
exp("hello&q ...
C++学习笔记——枚举类型
C++ 枚举类型学习笔记今天学习了 C++ 中枚举(enum)的几种用法,感觉对枚举的作用域和类型安全有了更清晰的认识!
1. 传统枚举(enum)—— 优点和“坑”优点:
定义一组命名的整数常量,让代码更易读。比如用 RED 代替 0,一眼就知道是什么意思。
“坑”:作用域污染!
问题:传统枚举的枚举项会“跑”到它所在的作用域里。比如我在全局定义一个 enum { RED, BLUE };,那 RED 和 BLUE 就像全局变量一样,可能会和别的变量或常量重名,导致冲突。
解决办法(不完美):
用 namespace 包起来:1234namespace Color { enum Type { RED = 15, YELLOW, BLUE };};// 使用时:Color::Type c = Color::RED;
这样 RED 就被限制在 Color 命名空间里了。但命名空间可以被后续扩充,在大项目里还是有重名的风险。
用 struct 或 class 包起来:1234struct Color1 { ...
C++学习笔记——指针与const的奇妙之旅
C++ 指针与 const 的奇妙之旅:从基础到高级应用引言:为什么指针和 const 这么重要?在C++的学习路上,指针和 const 绝对是两个绕不开的“拦路虎”,但它们也是C++强大和灵活的基石。刚开始学的时候,我常常被它们搞得晕头转向,尤其是当它们俩“手拉手”一起出现的时候,简直是“劝退神器”!
不过别担心,经过一番摸索和老师的耐心讲解,我发现它们其实并没有那么神秘。指针就像是内存的“地址簿”,能让我们直接找到数据;而 const 就像是数据的“守护神”,能防止数据被意外修改。当它们结合起来,就能实现更精细、更安全、更高效的代码控制。
这篇笔记就是我学习过程中的一些心得体会,希望能用大白话和生动的例子,帮助大家一起攻克这两个难点!
1. 指针:内存的“地址簿”想象一下,你的电脑内存就像一个巨大的图书馆,里面有很多书架(内存地址),每本书(数据)都放在一个特定的书架上。指针,就是记录这些书架位置的“地址簿”。它不存储书的内容,只存储书的“位置信息”。
是什么? 指针是一个变量,它存储的是另一个变量的内存地址。
怎么声明? 数据类型 *指针变量名;
int *p;:声明一个指向 ...
C++学习笔记——抽象类与多态
C++ 抽象类、纯虚函数与多态性:核心概念与生动解析1. 抽象类与纯虚函数:制定“通用行动纲领”想象一下,你是一个项目经理,要制定一个“通用行动纲领”,让所有团队成员(派生类)都必须完成某个任务,但具体怎么完成,由每个团队成员自己决定。
纯虚函数 (Pure Virtual Function):
它就像项目经理在“行动纲领”里写下的一个“待办事项”:virtual void 完成任务() = 0;。
= 0 的意思是:我只列出这个任务,具体怎么做(函数体),你们自己去想办法!它没有具体的实现。
抽象类 (Abstract Class):
如果一个“项目经理”(类)的“行动纲领”里有至少一个这样的“待办事项”(纯虚函数),那这个“项目经理”就是个“抽象项目经理”(抽象类)。
特点:你不能直接“雇佣”一个“抽象项目经理”(不能创建抽象类的对象),因为他还有没具体落实的任务。
作用:抽象项目经理存在的意义,就是让他的“下属团队”(派生类)去继承他,然后把那些“待办事项”都具体化(实现纯虚函数)。这样,所有团队成员就都得完成这个任务了!
生动示例:
1234567891011121 ...
Linux 基本指令学习介绍
Linux 基本指令学习介绍Linux 操作系统以其强大的命令行工具而闻名。掌握这些基本指令是高效使用 Linux 的关键。本文将介绍一些最常用和最基本的 Linux 指令,帮助初学者快速入门。
1. 文件和目录操作ls - 列出目录内容ls 命令用于列出指定目录下的文件和子目录。
ls: 列出当前目录内容。
ls -l: 以长格式(详细信息)列出。
ls -a: 列出所有文件,包括隐藏文件。
ls -lh: 以人类可读的格式显示文件大小。
cd - 改变目录cd 命令用于切换当前工作目录。
cd /path/to/directory: 切换到指定路径。
cd ..: 切换到上级目录。
cd ~: 切换到用户主目录。
cd -: 切换到上次所在的目录。
pwd - 显示当前工作目录pwd 命令用于显示当前用户所在的目录的绝对路径。
mkdir - 创建目录mkdir 命令用于创建新的目录。
mkdir my_directory: 创建一个名为 my_directory 的目录。
mkdir -p parent/child: 创建多级目录(如果父目录不存在则一并创建)。
rm ...
Git 基本指令学习介绍
Git 基本指令学习介绍Git 是一个分布式版本控制系统,广泛用于软件开发中的代码管理。掌握 Git 的基本指令对于团队协作和个人项目管理至关重要。本文将介绍一些最常用和最基本的 Git 指令,帮助您快速入门。
1. Git 配置在使用 Git 之前,通常需要配置您的用户信息。
git config - 配置 Git
git config --global user.name "Your Name": 设置全局用户名。
git config --global user.email "your_email@example.com": 设置全局用户邮箱。
git config --list: 查看所有 Git 配置。
2. 创建和克隆仓库git init - 初始化新仓库在现有项目目录中初始化一个新的 Git 仓库。
1git init
git clone - 克隆远程仓库从远程仓库克隆一个副本到本地。
1git clone <repository_url>
3. 文件的状态和暂存Git 中的文件有几种状态:未跟踪 (untrack ...
星露谷云服务器开服教程 (Ubuntu)
星露谷云服务器开服教程 (Ubuntu)本教程将指导您如何在基于 Ubuntu 系统的云服务器上搭建星露谷物语(Stardew Valley)多人联机服务器,通过 Stardew Multiplayer Server Mod 实现 24/7 在线托管。
前提条件
一台运行 Ubuntu Server 的云服务器(推荐 2核4G 或更高配置)。
SSH 客户端(如 PuTTY, Xshell 或终端)。
Steam 账号及已购买的星露谷物语。
一. 搭建云服务器
选择云服务商: 注册并登录阿里云、腾讯云、AWS 或其他云服务商账号。
创建实例:
地域: 选择离您和您的朋友较近的地域,以获得更低的延迟。
配置: 建议选择 2核4G 或更高配置的经济型实例。
操作系统: 选择 Ubuntu Server (例如 Ubuntu 20.04 LTS 或 22.04 LTS)。
安全组/防火墙: 重要! 确保开放星露谷物语服务器所需的端口(默认为 24642 TCP/UDP)。您可能还需要开放 SSH 端口(默认为 22 TCP)。
连接服务器: 使用 SSH ...
Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick StartCreate a new post1$ hexo new "My New Post"
More info: Writing
Run server1$ hexo server
More info: Server
Generate static files1$ hexo generate
More info: Generating
Deploy to remote sites1$ hexo deploy
More info: Deployment