最长不重复字符子串
最长不重复字符子串
ACWing: 61.最长不含重复字符的子字符串
LeetCode: 3.无重复字符的最长子串
1234567891011121314151617181920class Solution {public: int lengthOfLongestSubstring(string s) { int ans = 0; std::unordered_map<char, int> hash; for (int i = 0, j = 0; j < s.size(); ++j) { hash[s[j]]++; while (hash[s[j]] > 1) { // i不断前进,直到到了重复字符第一次出现的地方 hash[s[i]]--; i++; } ans = std::max(an ...
求两线段的交点
求两个线段的交点
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273#include <iostream>struct Point { double x; double y;};bool is_intersection(Point A, Point B, Point C, Point D) { // 计算向量 AB 和 AC 的叉积 double c1 = (B.x - A.x) * (C.y - A.y) - (B.y - A.y) * (C.x - A.x); // 计算向量 AB 和 AD 的叉积 double c2 = (B.x - A.x) * (D.y - A.y) - (B.y - A.y) * (D.x - A.x); // 计算向量 CD 和 CA 的叉积 double c3 = (D.x ...
深拷贝和浅拷贝
深拷贝是指,在拷贝对象时复制对象所有的成员变量和成员函数,包括指针指向的动态分配的内存。这样拷贝出来的对象和原对象是完全独立的,对任意一方操作,另一方不会受到影响;
浅拷贝是指,在拷贝对象是只复制对象的成员变量,不会复制指针指向的动态分配的内存。这样拷贝出来的对象,它的指针成员变量和原对象是一块内存,操作任意一方都会修改这块内存,另一方也会受到影响。
所以浅拷贝之后再对任一对象操作,很容易出现内存泄漏或者悬空指针的问题。
C++中的锁
C++中的锁是为了实现多线程编程时线程的同步和互斥机制。在多线程编程中,多个线程可能同时访问一个共享资源,如果没有合适的同步和互斥机制,会出现数据竞争和死锁的问题。
读写锁:std::shared_mutex,读写锁允许多个线程同时对共享资源进行读操作,但是不可以同时进行写操作。当一个线程获取到读锁时,其他线程可以获取读锁,但是无法获取写锁;当一个线程获取到写锁时,其他线程读锁和写锁都无法获取。
互斥锁:std::mutex,互斥锁就是基本的锁,保证同一时间只有一个线程访问共享资源,当一个线程获取互斥锁时,其他线程不能获取锁,直到该线程锁释放。
条件变量:条件变量主要用于线程间通信,可以使用wait让一个线程等候另一个线程的通知,当要等候的线程准备完成后,可以使用notify_one/notify_all来通知等待的线程;条件变量可以通过 std::condition_variable 类来实现。
map容器的实现
一、map 容器的实现
map 容器底层的实现是红黑树,内部是按照键值排序的(无序的是 unordered_map)。map的实现保证插入、查找和删除时间复杂度是O(log n),而unordered_map则可以实现常数时间操作(内部由 hash table 实现)。
红黑树是一种自平衡二叉查找树,保证插入、查找和删除时间复杂度是O(log n)。
红黑树节点要么是红色,要么是黑色;
红黑树根节点是黑色的;
每个叶子节点都是黑色的;
如果一个节点是红色的,那么它的两个叶子节点是黑色的;
对于每个节点,从该节点到它的所有后代叶子的简单路径上,都包含相同数量的黑色节点。
红黑树的平衡性通过对节点的颜色的调整来实现的。当插入或删除节点时,会破坏红黑树的平衡性,那么就需要旋转和重新分配颜色。
了解vector容器
一、迭代器
在遍历容器时删除元素会导致迭代器失效,这是因为删除元素时改变了容器内元素的位置,从而让迭代器指向的元素位置不再有效。
如果要在遍历时删除元素,可以使用 erase 函数,erase 函数会返回指向被删除元素的下一个元素的迭代器,因此不会使迭代器失效。
12345678910111213#include <vector>int main() { std::vector<int> n{1,2,3,4,5}; for (auto it = n.begin(); it != n.end();) { if (*it % 2 == 0) { it = n.erase(it) } else { ++it; } }}
C++的内存对齐
C++的内存对齐是指将数据存储在内存中时,会按照一定规则将数据的起始地址对齐到特定的地址上。在计算机中,数据的存储和访问通常是以字节为单位,而不是以位为单位的,内存对齐可以提升数据访问的效率。
提高数据访问效率。数据按照内存对齐规则时,CPU 可以一次读写多个数据,不需要多次访问内存;
减少内存碎片。按照规则对齐的数据大小通常是 2 的幂次方,避免出现奇怪的内存碎片;
提高缓存命中率:内存对齐可以提高缓存命中率。现代 CPU 中通常都有多级缓存,缓存的大小和行大小都是有限制的。当数据按照规则对齐时,它们可以更好地利用缓存行,从而提高缓存命中率。
保证数据正确性:内存对齐可以保证数据的正确性。当数据按照规则对齐时,可以避免出现数据对齐错误的情况,从而保证数据的正确性。
C++的继承、多态与虚函数
一、继承和多态的实现原理
继承是面向对象的一个重要概念,继承允许一个类从另外一个类继承它的属性和方法。并且允许子类重写父类的方法,从而实现不同的功能。
虚函数是C++中实现动态多态的关键机制,虚函数是一个在基类中声明的函数,它可以被子类重写。在使用基类指针或者引用调用虚函数时,实际调用的是子类中的实现。
虚函数表是 C++中实现动态多态的机制(vtable)。
每个包含虚函数的类中,都有一个虚函数表,它存储了该类的虚函数地址。当一个类被实例化(就是声明这个类的对象)时,它的对象中会包含一个指向该类虚函数的指针(vptr)。
编译器会根据虚函数指针来找到该对象所属基类对应的虚函数表,然后根据函数在虚函数表中的位置找到实际要调用的函数。实际调用的函数是在运行时确定的,而不是在编译时确定的,这个过程叫做动态绑定。
虚函数表是属于类的,不是属于类对象的,每个类有一个虚函数表;虚函数指针是属于类对象的,它指向类的虚函数表。
静态绑定是C++中的另一种机制,主要实现函数重载(同一作用域内定义多个同名但是参数类型或参数个数不同的函数)、运算符重载。因为要调用哪个函数是在编译阶段确定的,而 ...
每日公益团购汇总--4月18日
每日公益团购汇总–4月18日公益团购信息展示
序号
物品分类
物品名称
品牌渠道
数量/单位
预计到货日期
预计到货 时间范围
团长名称
配送状态
是否进行价格公示
1
餐饮熟食
shake shack汉堡
品牌社区团购
2022年4月19日
下午(12:00-18:00)
夹心
货品未到达小区
2
肉禽蛋品
日式唐杨
品牌社区团购
40箱
2022年4月19日
上午(6:00-12:00)
张雄杰
货品未到达小区
3
日常百货
奶粉尿不湿
品牌社区团购
22箱
2022年4月18日
下午(12:00-18:00)
然也
已在小区内配送
价格公示商家资质公示团购商家资质营业执照:通行证:司机核酸证明:保供证明:
每日疫情报告--4月18日
每日疫情报告–4月18日上海市疫情报告
上海4月17日新增本土确诊病例2417例、无症状感染者19831例2022年04月18日09:28 | 来源:健康上海
原标题:上海4月17日新增本土确诊病例2417例、无症状感染者19831例
2022年4月17日0—24时,新增本土新冠肺炎确诊病例2417例和无症状感染者19831例,其中853例确诊病例为此前无症状感染者转归,1409例确诊病例和19425例无症状感染者在隔离管控中发现,其余在相关风险人群排查中发现。新增境外输入性新冠肺炎确诊病例3例,均在闭环管控中发现。
数据来源于人民日报。
社区疫情报告
4月18日锦博苑情况告知:通知:今日本小区将进行一轮核酸筛查。今日核酸筛查除封控楼道将安排医生前往楼道筛查,其余楼道将从155号楼逐渐往小号楼栋叫号通知,请各位居民在家耐心等待,注意通知。
1、小区封控楼栋情况:小区为7+7封闭管理,本小区119号楼(自4月6日算起)、39号楼(自4月7日算起)、141号楼、142号楼(4月17日算起)、140号楼、54号楼(4月15日算起)、95号楼(4月17日算起)为14天封闭管理楼栋,16号 ...

