using 的三大作用汇总
本文将整理总结 using 的两个 "引入"、一个 "别名" 用法:using namespace `namespace` / using `namespace`::`member` / using `alias` = `typename`,以及 using 在类中被赋予的特殊意义。
模板元 - 三种条件编译汇总
前言
今天我们来谈谈条件编译。条件编译是非常有意思和方便的东西,它类似于函数重载,对于不同的类型使用不同的算法。这是传统的一个函数重载的示例,我们姑且将它算作条件编译:
12345678910int to_int(int i) { return i; }int to_int(double f) { return f; }int to_int(const char *s) { return atoi(s); }int to_int(const std::string &s) { return std::stoi(s); }int to_int(const std::vector<char> &v) { int ret = 0; for (char x : v) ret = ret << 8 | static_cast<unsigned int>(ret); return ret;}
但是,这种传统的条件编译 ...
类的六个特殊成员函数的自动合成
前言
类的六个特殊成员函数具体是:
123456789class A { public: A() = default; // 默认构造函数 A(const A &) = default; // 拷贝构造函数 A &operator=(const A &) = default; // 拷贝赋值函数 A(A &&) noexcept = default; // 移动构造函数 A &operator=(A &&) noexcept = default; // 移动赋值函数 ~A() noexcept = default; // 析构函数};
当我们未显式定义这六个函数时,编译器默认会自动合成,但当它们的其中一些被显式定义或删除时,它们的其中一些不会被生成。这一直是一个非常头疼的点,因为它们之间的关系可以说非常复杂。本文就将介绍这些函数在何时合成,以及应对之法。
开始前的一个小芝士 - 如何自己做实验这里我们还是问出了一个经典的问题,如何进行实验?基于实验我们 ...
CMU15445 Note
CMU15445 2023fall 个人笔记 | 官方链接 | Start @ 2024-01-14
根据 CMU 官方代码不公开要求,个人笔记部分不会包含任何任务清单相关代码实现,主要总结和记录遇到的问题和解决过程。
Project0 C++ Primer
Task1 Copy-on-Write Trie
Start @ 01-14 | Passed @ 01-16 | 22 hour
如何注册 Gradescope:
在 FAQ 中有写,CMU 为外部学生提供了注册码:
1KK5DVJ Carnegie Mellon University (2023 Fall)
顺便提醒,在代码提交前,make submit-px 后,请运行一个脚本 gradescope_sign.py。它是一个承诺书,不填写承诺书 Gradescope 将拒绝你。
遇到的问题:
这部分进行的可以说非常艰辛,其中主要体现在编译并运行上,而在 Trie 的代码实现上的却不是很多。主要是对于 shared_ptr 与 RTTI 缺乏实践以及缺乏项目编写经验吧。
刚看到这个项目是一脸懵逼的 ...
泛型算法 - 从泛型到函数绑定与迭代器拓展
什么是泛型
泛型是一种编程规范,它具有较高的抽象级别。泛型是描述一类函数,任何实现必要方法的对象都可以使用泛型函数。在一些其他语言中,会定义有接口的概念,它实际为一组函数的集合,任何符合全部函数的类都称为符合这个接口的。
在 C++ 标准库中存在大量的泛型函数,它们通常用于操作容器,这些泛型函数具有相同的特性,它们都将迭代器作为其主要参数,因此任何容器只要拥有足够支持的迭代器都可以使用泛型函数。
泛型函数的定义实际比较广泛,而在 C++ 中泛型通常特指迭代器实现的通用算法,其中常用的泛型算法就包括:std::find、std::sort 等,使用过这些函数的都清楚,它们的前两个参数均为迭代器对象。另外,在定义泛型时,还需要模板元语法的支持,不过本章节将着重介绍泛型的使用,我们暂时不会介绍如何定义自己的泛型。
初识迭代器
前面讲到,在 C++ 的泛型函数中,它们几乎都以迭代器作为其参数,而泛型函数要求对象具有相同的支持,换句话说它们必须满足接口(尽管 C++ 中并没有接口的概念)。那么我们首先需要了解一些基本的迭代器,了解它们具有哪些支持,因此可以用于哪些泛型函数。
迭代器类型
迭 ...
Python 虚拟 SSD 项目
Python 虚拟 SSD 项目 | 项目介绍:基于 socket 通信和存储管理优化的虚拟 SSD | 源码地址:Github 仓库: jamhus-tao/VirtualSSDbyPython
C++ 与三种智能指针 - 代码复现与辨析
前言
在 C 语言中,动态内存管理一直是一个非常头疼的问题,你需要自己申请内存与释放内存,一不小心就容易触发内存泄露、指针悬挂、重复释放等问题,这些问题可能还是隐性的,不容易排查。在 C++ 11 引入的三种智能指针 shared_ptr、unique_ptr、weak_ptr 用于自动管理动态内存,当然不规范的使用它们依然会导致一些问题。值得注意的是,在更早的 C++ 版本中的 auto_ptr 在 C++ 11 开始被弃用,在 C++ 17 被移除,你可以使用 unique_ptr 来替代它,本文不会讲解。
本文将从两个方面介绍 shared_ptr、unique_ptr、weak_ptr 三种智能指针,这包括:规范使用智能指针、智能指针原理和代码复现。
shared_ptr 共享指针
创建共享指针
shared_ptr 可以使用下面的四种方法构造:
1234567891011121314void deleter(int *p) { delete p; cout << "Free " << p << en ...
四种 cast 强制类型转换
前言
在 C 语言中,直接使用类型即可完成强制类型转换,形如 (int)x。而在 C++ 中强制类型转换被分为四类:static_cast / const_cast / reinterepret_cast / dynamic_cast 四类。当然 C++ 也保留了传统类型转换。
传统类型转换
传统 C 语言类型转换具有最高的级别,它能完成我们后面将会介绍的四种 cast 支持的所有强制类型转换。但在 C++ 中之所以提出四类 cast ,是因为将强制类型转换分门别类被认为是更安全的。首先,强制类型转换都是危险的,你需要清楚的知道进行转换可能带来的后果,四类 cast 一定程度上确保你正确进行转换,否则将会发生编译错误(dynamic_cast 可能会发生运行时错误)。
值得注意的是,在 C++ 中提出的 static_cast / const_cast / reinterepret_cast / dynamic_cast 都是关键字,足见其地位之重。
最后,传统 C 语言类型转换在 C++ 中又分为两种:C 风格类型转换、 C++ 风格传统类型转换。其实两者并没有区别,只是在语法习惯上 ...
使用 Matplotlib 绘图
前言
Matplotlib 在 Python 中提供了类似于 MATLAB 的绘图支持,有人说使用 Numpy、Pandas、Scipy、Matplotlib 就可以完全替代 MATLAB。其中,Matplotlib 提供图像库支持,而 Numpy 提供优秀的向量计算、Pandas 提供便携的结构存储、Scipy 提供额外的计算库支持。Matplotlib 经常被用于数据分析,常常和 Numpy 等一起使用,本文不会系统的介绍这些库,而是从一些示例的方式快速入手 Matplotlib。
在阅读本文方面的建议是,你无需记忆每个模块,需要时将本文中的代码粘贴到你的 IDE 中然后尝试运行并根据你的需求改写。另外,提前声明作者本人并未使用过 MATLAB 而直接学习使用的 Matplotlib。
多样式平面折线
Matplotlib 绘图最常用的就是 matplotlib.pyplot.plot 方法,它接受主参数 xdatax_{data}xdata、ydatay_{data}ydata,表示对应的 xxx 坐标和 yyy 坐标,例如 (xdata[0], ydata[0])(x_{ ...
事务隔离级别与 MVCC 机制
事务
在 MySQL 中事务提供三个关键字:BEGIN(开始事务)、COMMIT(提交事务)、ROLLBACK(回滚事务)。
事务以 BEGIN 开始,以 COMMIT 或 ROLLBACK 结束,如果事务提交那么正常结束,如果事务回滚它会回到 BEGIN 的状态。事务的作用在于,它将整个事务视为一个原子操作,必须全部完成,否则回滚。例如,我们在做一笔交易时,扣款和提交订单必须绑定完成,如果流程中出现任何故障它必须回滚。
COMMIT 示例COMMIT 输出ROLLBACK 示例ROLLBACK 输出1SELECT * FROM test;
1234BEGIN;INSERT INTO test VALUES(2, "Jhon", 20);SELECT * FROM test;COMMIT;
1SELECT * FROM test;12345+----+-----------+------+| id | name | age |+----+-----------+------+| 1 | JamhusTao | 19 |+----+--------- ...