MyTinySTL阅读笔记---概述

简介

STL一直在使用,有时候就想了解了解其中的实现原理,顺便复习复习数据结构和算法。
因为我水平有限,所以先找了一个简化版的MyTinySTL源码来看,配上STL源码剖析这本书,大概是能看懂一些了,这边简单记录一下。
并且还搬运了一些STL源码分析上面的内容,实在是比较懒,想看完整的可以看原本的博客。

六大组件

  1. 分配器:用来管理内存。
  2. 迭代器:将容器和算法粘合在一起,用来遍历STL容器中的部分或全部元素。
  3. 容器:封装了大量常用的数据结构。
  4. 算法:定义了一些常用算法。
  5. 仿函数:具有函数特质的对象。
  6. 适配器:主要用来修改接口。

在这里插入图片描述

文件分布

组件文件
分配器construct.h、allocator.h
迭代器iterator.h、type_traits.h
容器astring.h、basic_string.h、vector.h、list.h、deque.h、stack.h、queue.h、rb_tree.h、set.h、map.h、hashtable.h、unordered_set.h、unordered_map.h
算法uninitialized.h、algorithm.h、algobase.h、algo.h、set_algo.h、heap_algo.h、numeric.h
仿函数functional.h
配接器分布在很多角落

测试

MyTinySTL自己编写了函数用来测试都在test.h中,注释很全。

首先定义了输出的颜色,green代表成功 red代表失败。

#define green redbud::io::state::manual << redbud::io::hfg::green
#define red   redbud::io::state::manual << redbud::io::hfg::red

然后有两个类分别是单个测试和运行多个测试。

// 封装单个测试案例
class TestCase
{
public:
	// 构造函数,接受一个字符串代表案例名称
	TestCase(const char* case_name) : testcase_name(case_name) {}

	// 一个纯虚函数,用于测试案例
	virtual void Run() = 0;

public:
	const char* testcase_name;  // 测试案例的名称
	int         nTestResult;    // 测试案例的执行结果 
	double      nFailed;        // 测试失败的案例数
	double      nPassed;        // 测试通过的案例数
};
// 单元测试,把所有测试案例加入到 vector 中,依次执行测试案例
class UnitTest
{
public:
	// 获取一个案例
	static UnitTest* GetInstance();

	// 将案例依次加入 vector
	TestCase* RegisterTestCase(TestCase* testcase);

	void Run();

public:
	TestCase* CurrentTestCase;          // 当前执行的测试案例
	double    nPassed;                  // 通过案例数
	double    nFailed;                  // 失败案例数

protected:
	std::vector<TestCase*> testcases_;  // 保存案例集合
};

实现都很简单,后面还有一系列的宏用来进行断言操作。

对do…while(0)的疑惑

刚开始看的时候我还是很好奇为什么宏定义中要用do...while(0),如:

#define EXPECT_TRUE(Condition) do {                             \
  if (Condition) {                                              \
    UnitTest::GetInstance()->CurrentTestCase->nPassed++;        \
    std::cout << green << " EXPECT_TRUE succeeded!\n";          \
  }                                                             \
  else {                                                        \
    UnitTest::GetInstance()->CurrentTestCase->nTestResult = 0;  \
    UnitTest::GetInstance()->CurrentTestCase->nFailed++;        \
    std::cout << red << " EXPECT_TRUE failed!\n";               \
}} while(0)

既然循环里面只执行了一次,我要这个看似多余的do...while(0)有什么意义呢?

我们举个例子
有一个宏:

#define _DELETE(p) do{ delete p; p = NULL} while(0)

去掉do…while(0):

#define _DELETE(p) delete p; p = NULL;

调用

if(NULL != p) _DELETE(p)
else   ...do sth...

可能有人已经发现了去掉do…while(0)我们的代码可能会变成:

if(NULL != p) delete p; p = NULL;
else   ...do sth...

if分支后有两个语句,else分支没有对应的if,编译失败。
假设没有else, _DELETE中的第二个语句无论if测试是否通过,会永远执行。

有人说我写的if绝对加{},但是我们不能保证其他人对吧。

还有人可能会想我不能用{}吗一定要用do...while(0)吗?
的确,这样的话上面的问题是不存在了,但是我想对于C++程序员来讲,在每个语句后面加分号是一种约定俗成的习惯,这样的话,以下代码:

if(NULL != p) _DELETE(p);
else   ...do sth...

else就没法编译了。

使用

TEST(first)
{
	EXPECT_TRUE(true);
}

int main()
{
	RUN_ALL_TESTS();

	return 0;
}

运行结果:
在这里插入图片描述

  • 9
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 华为HCIP精品课程笔记-Wakin是一本非常有价值的学习资料。该笔记通过详细介绍HCIP认证的相关知识点和实用技能,为学生提供了一种高效学习的方式。 首先,华为HCIP精品课程笔记-Wakin涵盖了HCIP认证考试需要掌握的全部知识点。对于想要通过HCIP考试的学生来说,这本笔记提供了一个简明扼要的指南,可以帮助他们系统地学习和复习相关知识。笔记中的内容分为多个章节,涵盖了网络技术、路由器和交换机、路由控制、IP多播、IPv6和MPLS等重要主题。每个主题都有详细的解释和示例,帮助学生更好地理解和掌握。 其次,华为HCIP精品课程笔记-Wakin还包含了一些实用技能和案例分析。这些内容能够帮助学生更好地理解和应用所学知识。对于在实际工作中需要应用HCIP技能的人来说,这本笔记提供了一些宝贵的经验和建议。 此外,华为HCIP精品课程笔记-Wakin还提供了一些习题和练习题,可以帮助学生检验自己的学习成果。通过对这些习题的练习,学生可以更好地了解自己的薄弱点,并进行有针对性的复习和提高。 总之,华为HCIP精品课程笔记-Wakin是一本非常实用和有价值的学习资料。它提供了一种高效的学习方式,帮助学生系统地掌握和应用HCIP认证的相关知识和技能。我强烈推荐这本笔记给所有想要通过HCIP考试或者在实际工作中应用HCIP技能的人。 ### 回答2: 《华为HCIP精品课程笔记-wakin》是一本非常有价值的学习资料。这本书由华为公司精心编撰而成,旨在帮助学员高效学习和掌握华为认证网络工程师(HCIP)认证所需的知识和技能。 这本笔记深入浅出地介绍了HCIP认证相关的重要概念、原理和应用。其中包括了网络架构设计、路由与交换技术、安全技术、无线网络技术等内容。每个主题都有详细的解释、示意图和实例,使读者能够更好地理解和应用知识。 除了内容丰富全面外,这本笔记还具有一些独特的优点。首先,它采用了华为独有的学习方法,系统化地梳理了知识结构,使读者能够更加有条理地学习。其次,每个章节都附带了重点整理的要点,方便读者快速回顾和温习。此外,为了帮助读者更好地理解,笔记还提供了一些实验和实际案例,使学习更加实践性和深入。 通过学习《华为HCIP精品课程笔记-wakin》,读者将能够全面了解和掌握HCIP认证所需的知识和技能。这些知识和技能不仅适用于工作中的网络工程师,也对于其他相关岗位的人员有很大的帮助。无论是对于初学者还是对于有一定经验的人来说,这本书都是一本非常实用的学习资料。强烈推荐给所有对网络工程感兴趣的人士。 ### 回答3: 华为HCIP精品课程笔记-Wakin是一份非常有价值的学习资料。这份笔记由华为公司的专业培训师Wakin编写,对于想要学习和提升HCIP认证的人来说,是一份非常实用的参考资料。 Wakin在这份笔记中,详细地介绍了HCIP的知识点和考试重点。他从网络基础、路由交换、安全技术、无线网络等多个方面入手,深入浅出地解释了每个知识点的概念和原理。在每个章节中,Wakin都给出了一些实际案例和实验,帮助我们更好地理解和应用所学内容。 此外,Wakin在笔记中还提供了一些学习方法和技巧。他建议我们在学习过程中,要注重实践,通过自己动手实验和配置设备来加深对知识的理解。他还推荐了一些学习资源和参考书籍,帮助我们更好地补充和扩展所学知识。 总的来说,华为HCIP精品课程笔记-Wakin非常全面且易于理解。无论是准备HCIP认证考试的人,还是想要进一步提升自己网络技术的人,都可以从中受益匪浅。我相信,只要认真学习并灵活运用这份笔记中的知识,就能够在网络领域中取得更好的成绩和发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值