08 2024 档案
单调栈
摘要:单调栈 经典用法:在数组中当前元素的两侧找第一个比当前元素更大(更小)的数在哪 维持求解答案的可能性 单调栈里的所有对象按照规定好的单调性来组织 当某个对象进入单调栈时,会从栈顶开始依次淘汰单调栈里对后续求解答案没有帮助的对象 每个对象从栈顶弹出时结算当前对象参与的答案,随后这个对象不再参与后续求解
C++刷题小知识点
摘要:数据结构定义 struct ListNode { int val; ListNode *next; ListNode() : val(0), next(nullptr) {} ListNode(int x) : val(x), next(nullptr) {} ListNode(int x, Lis
C++基础
摘要:指针 #include <iostream> using namespace std; int main() { // 实际变量的声明 int var = 20; // 指针变量的声明 int *addr; // 在指针变量中存储 var 的地址 addr = &var; cout << "var
string
摘要:string string 作为类出现,其集成的操作函数足以完成多数情况下的需要。可以使用 "=" 进行赋值,使用 "==" 进行等值比较,使用 "+" 做串联。 要使用 string 类,必须包含头文件 <string>。在 STL 库中,basic_string 有两个预定义类型:包含 char
priority_queue
摘要:priority_queue priority_queue 容器适配器定义了一个元素有序排列的队列。默认队列头部的元素优先级最高。因为它是一个队列,所以只能访问第一个元素,这也意味着优先级最高的元素总是第一个被处理。 // 有 3 个参数,其中两个有默认的参数;第一个参数是存储对象的类型,第二个参数
queue
摘要:queue 只能访问 queue<T> 容器适配器的第一个和最后一个元素。只能在容器的末尾添加新元素,只能从头部移除元素。 queue 的生成方式和 stack 相同,下面展示如何创建一个保存字符串对象的 queue: queue<string> words; 也可以使用拷贝构造函数: queue<
stack
摘要:stack 定义一个用来存放字符串对象的 stack 容器: stack<string> words; stack 容器适配器的模板有两个参数。第一个参数是存储对象的类型,第二个参数是底层容器的类型。stack<T> 的底层容器默认是 deque<T> 容器,因此模板类型其实是 stack<type
容器适配器
摘要:容器适配器 容器适配器是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些不同的功能。之所以称作适配器类,是因为它可以通过适配容器现有的接口来提供不同的功能。 stack<T>:是一个封装了 deque<T> 容器的适配器类模板,默认实现的是一个后入先出(Last-In-First-Ou
forward_list
摘要:forward_list forward_list 容器以单链表的形式存储元素。forward_list 的模板定义在头文件 forward_list 中。fdrward_list 和 list 最主要的区别是:它不能反向遍历元素;只能从头到尾遍历。 forward_list 的单向链接性也意味着它
list
摘要:list list<T> 容器模板定义在 list 头文件中,是 T 类型对象的双向链表。 list 容器具有一些 vector 和 deque 容器所不具备的优势,它可以在常规时间内,在序列已知的任何位置插入或删除元素。这是我们使用 list,而不使用 vector 或 deque 容器的主要原因
C++基础
摘要:指针 #include <iostream> using namespace std; int main() { // 实际变量的声明 int var = 20; // 指针变量的声明 int *addr; // 在指针变量中存储 var 的地址 addr = &var; cout << "var
C++容器概览
摘要:容器 容器是用来存储数据的序列,它们提供了不同的存储方式和访问模式。 STL 中的容器可以分为三类: 1、序列容器:存储元素的序列,允许双向遍历。 vector:动态数组,支持快速随机访问。 deque:双端队列,支持快速插入和删除。 list:链表,支持快速插入和删除,但不支持随机访问。 2、关联
deque
摘要:deque deque<T>,一个定义在 deque 头文件中的容器模板,可以生成包含 T 类型元素的容器,它以双端队列的形式组织元素。可以在容器的头部和尾部高效地添加或删除对象,这是它相对于 vector 容器的优势。 创建 #include <algorithm> #include <strin
vector
摘要:vector vector<T> 容器是包含 T 类型元素的序列容器,和 array<T,N> 容器相似,不同的是 vector<T> 容器的大小可以自动增长,从而可以包含任意数量的元素;因此类型参数 T 不再需要模板参数 N。只要元素个数超出 vector 当前容量,就会自动分配更多的空间。只能在
array
摘要:array array<T,N> 模板定义了一种相当于标准数组的容器类型。它是一个有 N 个 T 类型元素的固定序列。除了需要指定元素的类型和个数之外,它和常规数组没有太大的差别。显然,不能增加或删除元素。 模板实例的元素被内部存储在标准数组中。和标准数组相比,array 容器的额外幵销很小,但提供
序列容器
摘要:序列容器 序列容器以线性序列的方式存储元素。它没有对元素进行排序,元素的顺序和存储它们的顺序相同。5 种标准的序列容器,每种容器都具有不同的特性: array<T,N> (数组容器) :长度固定的序列,有 N 个 T 类型的对象,不能增加或删除元素。 vector<T> (向量容器) :长度可变的序
c++11大括号初始化
摘要:C++11可以将{}初始化器用于任何类型(可以用等号,也可以不用) 数组、集合初始化 在C++11中,集合(列表)的初始化已经成为C++的一个基本功能,被称为“初始化列表”: // C++98支持,C++11支持 int a[] = {1, 2, 3}; // C++98不支持,C++11支持 in
NIO聊天室
摘要:SocketChannel 和 ServerSocketChannel ServerSocketChannel 用于创建服务器端套接字,而 SocketChannel 用于创建客户端套接字。它们都支持阻塞和非阻塞模式,通过设置其 blocking 属性来切换。阻塞模式下,读/写操作会一直阻塞直到完成
NIO和传统IO
摘要:传统 IO 基于字节流或字符流(如 FileInputStream、BufferedReader 等)进行文件读写,以及使用 Socket 和 ServerSocket 进行网络传输。 NIO 使用通道(Channel)和缓冲区(Buffer)进行文件操作,以及使用 SocketChannel 和
Paths和Files
摘要:Paths 类 Paths 类主要用于操作文件和目录路径。它提供了一些静态方法,用于创建java.nio.file.Path实例,代表文件系统中的路径。 // 创建一个Path实例,表示当前目录下的一个文件 Path path = Paths.get("example.txt"); // 创建一个绝
Buffer和Channel
摘要:IO 和 NIO 区别: 可简单认为:IO 是面向流的处理,NIO 是面向块(缓冲区)的处理 面向流的 I/O 系统一次一个字节地处理数据。 一个面向块(缓冲区)的 I/O 系统以块的形式处理数据。 NIO 主要有两个核心部分组成: Buffer 缓冲区 Channel 通道 相对于传统 IO 而言
NIO、BIO、AIO区别
摘要:BIO 全称 Block-IO 是一种同步且阻塞的通信模式。是一个比较传统的通信方式,模式简单,使用方便。但并发处理能力低,通信耗时,依赖网速。 Java NIO,全程 Non-Block IO ,是 Java SE 1.4 版以后,针对网络传输效能优化的新功能。是一种非阻塞同步的通信模式。 NIO
打印流
摘要:PrintStream 是 OutputStream 的子类,PrintWriter 是 Writer 的子类。 打印流具有以下几个特点: 可以自动进行数据类型转换:打印流可以将各种数据类型转换为字符串,并输出到指定的输出流中。 可以自动进行换行操作:打印流可以在输出字符串的末尾自动添加换行符,方便
转换流
摘要:转换流主要有两种类型:InputStreamReader 和 OutputStreamWriter。 InputStreamReader 将一个字节输入流转换为一个字符输入流,而 OutputStreamWriter 将一个字节输出流转换为一个字符输出流。它们使用指定的字符集将字节流和字符流之间进行
缓冲流
摘要:Java 的缓冲流是对字节流和字符流的一种封装,通过在内存中开辟缓冲区来提高 I/O 操作的效率。Java 通过 BufferedInputStream 和 BufferedOutputStream 来实现字节流的缓冲,通过 BufferedReader 和 BufferedWriter 来实现字符
字符流
摘要:使用字节流该如何正确地读出中文: try (FileInputStream inputStream = new FileInputStream("a.txt")) { byte[] bytes = new byte[1024]; int len; while ((len = inputStream.