特殊类设计 发表于 2020-08-20 更新于 2023-05-07 分类于 C++ 本文字数: 2.4k 阅读时长 ≈ 2 分钟 只能在堆上创建对象的类 构造函数私有 提供一个静态的堆上创建对象的方法 防止拷贝(拷贝构造声明为私有且不实现,或者声明为delete) 阅读全文 »
C++11中的新特性 发表于 2020-07-27 更新于 2023-05-07 分类于 C++ 本文字数: 9k 阅读时长 ≈ 8 分钟 列表初始化C++11:支持内置类型与自定义类型的列表初始化,其中自定义类型不是天然支持列表初始化,需要显示定义参数类型为initiaizer_list的构造函数 12345678910111213141516171819202122232425262728class A{public: A (int a, int b) : _a(a) , _b(b) { }private: int _a; int _b;};int arr[] = {1, 2, 3, 4, 5};int a = 1;int b = { 1 };int c{ 1 };float d = { 1.2 };vector<int> arr1{1, 2, 3, 4, 5};vector<int> arr2 = {1, 2, 3};pair<int, int> p = {1, 1};map<int, int> m = { {1, 1}, {2, 2}, {3, 3} };A a = {1, 2};A a(1, 2); 阅读全文 »
从无序关联容器到哈希(及无序关联容器的模拟实现) 发表于 2020-07-19 更新于 2023-05-07 分类于 C++ 本文字数: 9.4k 阅读时长 ≈ 9 分钟 无序关联容器unordered_map基本使用与map相同,迭代器无反向迭代器,无序map,其体现在遍历时无序 123456789101112131415161718192021222324252627282930313233#include <unordered_map>void testUMap(){ unordered_map<int, int> um; map<int, int> m; um.insert(make_pair(1, 1)); um.insert(make_pair(10, 1)); um.insert(make_pair(2, 1)); um.insert(make_pair(15, 1)); um.insert(make_pair(8, 1)); um[100] = 100;//插入 um[15] = 15;//修改 um.at(2) = 2;//at无法插入,key不存在直接抛异常 //遍历无序 unordered_map<int, int>::iterator uit = um.begin(); while (uit != um.end()) { cout << uit->first << "-->" << uit->second << endl; uit++; } uit = um.find(100);//find找到返回指定位置迭代器,找不到则返回end迭代器 cout << um.count(100) << endl;//count返回元素个数,1或0 cout << uit->first << "-->" << uit->second << endl; uit = um.find(20); cout << um.count(20) << endl; cout << (uit == um.end()) << endl;} 阅读全文 »
map和set的模拟实现 发表于 2020-07-17 更新于 2023-05-07 分类于 C++ 本文字数: 2.9k 阅读时长 ≈ 3 分钟 改造红黑树关联式容器存储的是K, V键值对,故在改造红黑树时,K为key类型,对于V来说,如果是set,则其为K类型,如果是map则为 pair<K, V>,类型,除此之外,还需要一个仿函数类KeyOfValue来兼容map与set的大小比较,其迭代器也需要封装指针为一个类,迭代器的自加自减相当于红黑树的中序遍历 阅读全文 »
从AVL树到红黑树(的插入) 发表于 2020-07-13 更新于 2023-05-07 分类于 C++ 本文字数: 7.7k 阅读时长 ≈ 7 分钟 AVL树 左右子树都是AVL树 左右子树高度差的绝对值不超过1(-1/0/1)(一般:右子树高度 - 左子树高度) 如果一棵二叉搜索树树高度平衡的,它就是AVL树。如果它有n个节点,其高度可保持在O(log2N),搜索时间复杂度O(log2N) 阅读全文 »
set与map的基本使用及特性 发表于 2020-07-12 更新于 2023-05-07 分类于 C++ 本文字数: 6.4k 阅读时长 ≈ 6 分钟 set 实现—->目前使用搜索树实现(红黑树) 底层是一个存放KV结构的搜索树,但是此处K、V相同 set中只需要存放value set中不能存放重复的元素 set中的元素不能修改,不支持修改的操作 set默认比较是小于,可以通过修改仿函数,修改比较逻辑 迭代器遍历有序:底层顺序是二叉搜索树的中序遍历 迭代器只能读取内容,不能修改内容 插入:如果用迭代器指定插入位置,最终实际的插入位置可能不是指定的位置,此处的位置只是一个建议,新的元素的插入位置必须符合搜索树的性质 删除会导致当前删除位置的迭代器失效,但是不影响其他位置的迭代器 find:找到返回元素的迭代器,未找到返回end迭代器 count:获取指定元素在set中的个数,根据性质4,只用两个值,1或0 阅读全文 »
位图、布隆过滤器与大数据处理 发表于 2020-07-10 更新于 2024-05-25 分类于 C++ 本文字数: 3.1k 阅读时长 ≈ 3 分钟 位图每一个比特位来表示当前比特位对应的数据是否存在,存在为1,不存在为0 整数数组: 整数位置:n/32 整数位置中具体的bit位置:n%32 右移相当于除,右移n位 == 数字➗2^n^ 位图实现:哈希表 实现:整数数组 数据单元是bit位 节省空间,一个字节可以存放8个整数的二值信息(存在与否),不存放数据本身 操作效率高,通过哈希映射获取位置,通过位运算执行操作, 时间效率O(1) 位置映射: 获取整数位置,n / 32 获取整数的比特位:n % 32 位图需要的空间大小和数据的范围有关,和数据本身大小没有关系 适合的场景:数据不重复,信息简单 阅读全文 »
二叉搜索树的简单实现 发表于 2020-07-04 更新于 2023-05-07 分类于 C++ 本文字数: 3.5k 阅读时长 ≈ 3 分钟 二叉搜索树 若左子树非空,则左子树上所有节点的值都小于根节点的值 若右子树非空,则右子树上所有节点的值都小根节点的值 左右子树也是二叉搜索树 上述条件反之亦可 阅读全文 »
C++多态的基本原理及使用 发表于 2020-06-28 更新于 2023-05-07 分类于 C++ 本文字数: 1.7k 阅读时长 ≈ 2 分钟 多态的概念、定义以及实现多种形态,当不同的对象去执行同一种行为时,产生的不同表现形态 构成条件:在不同的继承关系的类对象,去调用同一函数,产生了不同的行为 继承关系 必须通过基类的指针或者引用调用的虚函数,一般都是用父类指针/引用指向父类以及子类实体,即都为切片行为 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写 阅读全文 »
C++中的继承 发表于 2020-06-26 更新于 2023-05-07 分类于 C++ 本文字数: 3.5k 阅读时长 ≈ 3 分钟 继承概念类级别的代码复用 继承方式:public、protected、private protectde访问权限/private访问权限: protected —-> 在当前类和子类中可见,在其他地方不可见 private —-> 在当前类中可见,在其他地方不可见 父类成员在子类中的访问权限:min { 成员在父类中的原始访问权限,继承方式 } 一般都是public继承,protected/private继承很少使用/几乎不用 默认继承方式: class定义的类默认继承方式是private struct定义的类默认继承方式public 阅读全文 »