MyTinySTL——vector.h 学习笔记

#ifdef max
#pragma message("#undefing marco max")
#undef max
#endif // max
  1. #ifdef是一句电脑程序语句。可以用它区隔一些与特定头文件、程序库和其他文件版本有关的代码。可翻译为:如果宏定义了语句1则执行程序2。
  2. 在所有的预处理指令中,#pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。
  • #pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。
  • #pragma指令格式一般为: #pragma Para,其中Para 为参数。
  • Message 参数能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:
    #pragma message("消息文本")
    
  1. #define定义预处理器标识符,将保持已定义状态且在作用域内,直到程序结束或者使用#undef 指令取消定义。
  2. #endif用于结束条件编译,编译时与前面最近的#if、#ifdef或#ifndef作为一对,经常一起使用,编译两者之间的部分程序段。
  3. 这段预编译代码的功能是:如果标识符 max 已经用宏定义进行过定义(#ifdef max) ,那么在编译输出窗口打印文本 “#undefing marco max” (#pragma message(“#undefing marco max”)),然后删除事先定义的宏定义 max (#undef max),最后结束#ifdef语句
    (#endif)。
#ifdef min
#pragma message("#undefing marco min")
#undef min
#endif // min

这段预编译代码的功能是:如果标识符 min已经用宏定义进行过定义(#ifdef min) ,那么在编译输出窗口打印文本 “#undefing marco min” (#pragma message(“#undefing marco min”)),然后删除事先定义的宏定义 min(#undef min),最后结束#ifdef语句
(#endif)。

模板类: vector
模板参数 T 代表类型

template <class T>

C++类模板 template <class T>

static_assert(!std::is_same<bool, T>::value, "vector<bool> is abandoned in mystl");
  1. assert的作用是先计算表达式 expression ,如果其值为假,那么它先向std::err打印一条出错信息,然后通过调用 abort ()来终止程序运行。
  • assert分为动态断言和静态断言2种。
  • static_assert关键字用来实现编译期间的断言,叫静态断言。语法:static_assert(常量表达式,要提示的字符串)。如果第一个参数常量表达式的值为false,会产生一条编译错误,错误位置就是该static_assert语句所在行,第二个参数就是错误提示字符串。然后通过调用 abort 来终止程序运行。
  1. std::is_same<bool, T>::value, 如果传入模板参数是bool,那么 std::is_same<bool, T>::value 值为true。
  2. 该静态断言的代码含义:如果传入模板类型是bool的话,就会产生断言错误,并在编译窗口打印 “vector is abandoned in mystl”。

"typename"用于指出模板声明(或定义)中的非独立名称(dependent names)是类型名,而非变量名。

namespace mystl {

    template <class T>
    class vector {
        typedef mystl::allocator<T>     data_allocator;
        vector() noexcept  { try_init(); }
    }
    
    // try_init 函数,若分配失败则忽略,不抛出异常
    template <class T>
    void vector<T>::try_init() noexcept {
        try {
            begin_ = data_allocator::allocate(16);
            end_ = begin_;
            cap_ = begin_ + 16;
        }
        catch (...)  {
            begin_ = nullptr;
            end_ = nullptr;
            cap_ = nullptr;
        }
    }
    
    // 内存分配函数:返回分配内存的指针
    template <class T>
    T* allocator<T>::allocate(size_type n) {
        if (n == 0)
            return nullptr;
        return static_cast<T*>(::operator new(n * sizeof(T)));
    }
}

知识点:

  1. sizeof:C/C++中的操作符,其作用是返回一个对象或者类型所占的内存字节数;
  2. operator new:C++操作符,用于申请内存中的一块空间,申请完后什么都不做;
  3. ::operator new(n * sizeof(T)):分配 n * sizeof(T) 个字节的原始的未命名内存,并返回指向该内存的指针void *;由于 operator new() 不属于std namespace,而是属于global namespace,所以其前使用::(作用域限定符);
  4. static_cast:C++运算符,功能是把一个表达式转换为某种类型,但没有运行时类型检查来保证转换的安全性。
  5. static_cast<T*>(::operator new(n * sizeof(T))):static_cast<T*> 将(::operator new(n * sizeof(T))返回的未初始化的指针转义为T模板类型指针:T*;
  6. try { } catch(…) { }: try块标识特定的异常可能被激活的代码块,后面跟一个或多个catch块。try块是由关键字try指示的,关键字try的后面是由花括号括起的代码块,表明需要注意这些代码引发的异常;执行try语句块,有任何异常执行catch语句块;
  7. 要想处理构造函数初始值抛出异常,必须要将构造函数写成函数try语句块形式。
  8. allocate 类提供一种感知的内存分配方法,它分配的内存是原始的、未构造的。帮助程序实现内存分配和对象构造的分离。
    代码功能:
  9. noexcept表示函数不会抛出异常。如果noexcept修饰的函数抛出了异常,编译器可以选择直接调用std::terminate(),该函数内部会调用std::abort()终止程序。3 4 这有利于编译器对程序做更多的优化。

代码功能

  1. allocate函数为vector对象分配一个分配一块容量为16sizeof(T)的、原始的、未命名的内存空间来存储vector对象并将返回的指针转义为T指针;
    try_init()函数中使用try语句块来进行vector对象的数据成员begin_、end_和cap_的初始化,使用try语句块来处理构造函数阶段出现的任何异常。allocate函数返回的 T*指针赋值给begin_, 剩余两个数据对象用begin_来赋值。
    该段代码特点:实现了内存分配(allocate)和对象构造(try_init())的分离。

# 欢迎使用Markdown编辑器

你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

## 新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
 1. **全新的界面设计** ,将会带来全新的写作体验;
 2. 在创作中心设置你喜爱的代码高亮样式,Markdown **将代码片显示选择的高亮样式** 进行展示;
 3. 增加了 **图片拖拽** 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
 4. 全新的 **KaTeX数学公式** 语法;
 5. 增加了支持**甘特图的mermaid语法[^1]** 功能;
 6. 增加了 **多屏幕编辑** Markdown文章功能;
 7. 增加了 **焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置** 等功能,功能按钮位于编辑区域与预览区域中间;
 8. 增加了 **检查列表** 功能。
 [^1]: [mermaid语法说明](https://mermaidjs.github.io/)

## 功能快捷键

撤销:<kbd>Ctrl/Command</kbd> + <kbd>Z</kbd>
重做:<kbd>Ctrl/Command</kbd> + <kbd>Y</kbd>
加粗:<kbd>Ctrl/Command</kbd> + <kbd>B</kbd>
斜体:<kbd>Ctrl/Command</kbd> + <kbd>I</kbd>
标题:<kbd>Ctrl/Command</kbd> + <kbd>Shift</kbd> + <kbd>H</kbd>
无序列表:<kbd>Ctrl/Command</kbd> + <kbd>Shift</kbd> + <kbd>U</kbd>
有序列表:<kbd>Ctrl/Command</kbd> + <kbd>Shift</kbd> + <kbd>O</kbd>
检查列表:<kbd>Ctrl/Command</kbd> + <kbd>Shift</kbd> + <kbd>C</kbd>
插入代码:<kbd>Ctrl/Command</kbd> + <kbd>Shift</kbd> + <kbd>K</kbd>
插入链接:<kbd>Ctrl/Command</kbd> + <kbd>Shift</kbd> + <kbd>L</kbd>
插入图片:<kbd>Ctrl/Command</kbd> + <kbd>Shift</kbd> + <kbd>G</kbd>
查找:<kbd>Ctrl/Command</kbd> + <kbd>F</kbd>
替换:<kbd>Ctrl/Command</kbd> + <kbd>G</kbd>

## 合理的创建标题,有助于目录的生成

直接输入1次<kbd>#</kbd>,并按下<kbd>space</kbd>后,将生成1级标题。
输入2次<kbd>#</kbd>,并按下<kbd>space</kbd>后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用`TOC`语法后生成一个完美的目录。

## 如何改变文本的样式

*强调文本* _强调文本_

**加粗文本** __加粗文本__

==标记文本==

~~删除文本~~

> 引用文本

H~2~O is是液体。

2^10^ 运算结果是 1024.

## 插入链接与图片

链接: [link](https://www.csdn.net/).

图片: ![Alt](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw)

带尺寸的图片: ![Alt](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw =30x30)

居中的图片: ![Alt](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw#pic_center)

居中并且带尺寸的图片: ![Alt](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9hdmF0YXIuY3Nkbi5uZXQvNy83L0IvMV9yYWxmX2h4MTYzY29tLmpwZw#pic_center =30x30)

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

## 如何插入一段漂亮的代码片

去[博客设置](https://mp.csdn.net/console/configBlog)页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 `代码片`.
```javascript
// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。1

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

2014-01-07 2014-01-09 2014-01-11 2014-01-13 2014-01-15 2014-01-17 2014-01-19 2014-01-21 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.3.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. 注脚的解释 ↩︎

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值