Skip to content
This repository has been archived by the owner on Sep 15, 2024. It is now read-only.

Commit

Permalink
array: code and chapter - over
Browse files Browse the repository at this point in the history
  • Loading branch information
Sunrisepeak committed Apr 20, 2024
1 parent 00eb665 commit e82469a
Show file tree
Hide file tree
Showing 6 changed files with 51 additions and 13 deletions.
5 changes: 2 additions & 3 deletions exercises/array/Array.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,9 @@
#include <initializer_list>

namespace d2ds {
//using dstruct::Array;

// show your code

/*
template <typename T, unsigned int N>
class Array {
Expand Down Expand Up @@ -81,6 +80,6 @@ class Array {
private:
T mData_e[N == 0 ? 1 : N];
};

*/
}
#endif
42 changes: 37 additions & 5 deletions src/chapter_01_array.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
- 数据访问 - 下标访问运算符重载
- 常用函数实现 - size/back
- 迭代器支持 - 范围for
- 负下标访问支持
- 功能扩展 - 负下标访问支持
- 总结

---
Expand Down Expand Up @@ -118,8 +118,6 @@ BigFive核心指的是一个类型对象的**拷贝语义**和**移动语义**,
| `ClassName(ClassName &&)` | 移动构造 |
| `ClassName & operator=(ClassName &&)` | 移动赋值 |
> Note: 更多关于BigFive-**拷贝语义**和**移动语义**的介绍放到**C++基础章节**
**析构行为**
由于Array中也是使用原生数组来进行存储数据的, 这里使用使用默认的构造函数和析构和原生数组行为保持一致
Expand All @@ -136,6 +134,8 @@ public: // bigFive

**拷贝语义**

主要是方便数据结构中数据复制的方便

拷贝构造

```cpp
Expand Down Expand Up @@ -163,6 +163,14 @@ public: // bigFive
拷贝赋值

```cpp
d2ds::Array<BigFiveTest::Obj, 5> intArr1, intArr2;
// ...
intArr1 = intArr2;
```

通过赋值`=`运算符, 把一个Array中的数据复制到另一个数组中

```cpp
template <typename T, unsigned int N>
class Array {
Expand All @@ -181,8 +189,18 @@ public: // bigFive
**移动语义**
有些场景为了性能会使用**移动语义**, 只去改变数据的**所有权(ownership)**来避免数据资源的重复制、频繁分配/释放带来的开销
移动构造
```cpp
d2ds::Array<BigFiveTest::Obj, 5> intArr1;
//...
d2ds::Array<BigFiveTest::Obj, 5> intArr2 { std::move(intArr1) };
```

这里假设intArr1后续不在使用, 如果使用**拷贝构造**, 可能就会造成`BigFiveTest::Obj`中动态分配的资源没有必要的分配和复制。例如, 对象中有一个指针并指向一块资源, 使用移动构造去触发对象只复制资源的地址, 而不需要重新分配并做数据复制。**移动构造**中不仅要把数据结构的资源进行移动, 一些情况也要把**移动语义**传给直接管理的数据

```cpp
template <typename T, unsigned int N>
class Array {
Expand All @@ -199,6 +217,14 @@ public: // bigFive
移动赋值
```cpp
d2ds::Array<BigFiveTest::Obj, 5> intArr1, intArr2;
// ...
intArr1 = std::move(intArr2);
```

移动赋值和移动构造一样

```cpp
template <typename T, unsigned int N>
class Array {
Expand All @@ -215,7 +241,9 @@ public: // bigFive
};
```
> 注意: D2DS_SELF_ASSIGNMENT_CHECKER 宏是防止对象自我赋值情况的一个检测。例如:对象myObj赋值给自己(`myObj = myObj;`)。 该宏的实现原理(`if (this == &dsObj) return *this;`)是通过地址检查来规避这种情况
> Note1: D2DS_SELF_ASSIGNMENT_CHECKER 宏是防止对象自我赋值情况的一个检测。例如:对象myObj赋值给自己(`myObj = myObj;`)。 该宏的实现原理(`if (this == &dsObj) return *this;`)是通过地址检查来规避这种情况
> Note2: 对于Array的移动语义是不够直观的, 在Vector实现中有更直观的使用, 且更多关于BigFive-**拷贝语义**和**移动语义**的介绍将放到**C++基础章节**
### 数据访问 - 下标运算符重载
Expand Down Expand Up @@ -278,6 +306,8 @@ public:

### 迭代器支持

对于Array的迭代器, 由于内部是使用数组来存储数据, 数据是在连续内存空间上的, 可以直接使用类型的指针作为迭代器类型来做迭代器支持和范围for的使用

```cpp
template <typename T, unsigned int N>
class Array {
Expand All @@ -293,9 +323,11 @@ public:
};
```

### 额外功能 - 负下标访问
> Note: 关于范围for和迭代器相关的内容见**相关主体**部分

### 扩展功能 - 负下标访问

在里在给Array添加一个**扩展功能**, 像其他一些语言来支持负号下标访问

```cpp
template <typename T, unsigned int N>
Expand Down
4 changes: 2 additions & 2 deletions tests/array/array.4.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// array.0.cpp - readonly
// array.4.cpp - readonly
//
// 描述:
// 数据结构Array的常用函数实现
// 数据结构Array常用函数实现
//
// 目标/要求:
// - 实现 size, back 成员函数
Expand Down
2 changes: 1 addition & 1 deletion tests/array/array.5.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// array.0.cpp - readonly
// array.5.cpp - readonly
//
// 描述:
// 数据结构Array的迭代器支持 - 范围for支持
Expand Down
2 changes: 1 addition & 1 deletion tests/array/array.6.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// array.0.cpp - readonly
// array.6.cpp - readonly
//
// 描述:
// 数据结构Array负下标访问数据支持
Expand Down
9 changes: 8 additions & 1 deletion xmake.lua
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ task("dslings")
import("core.project.target")
import("core.base.global")

local checker_pass = true
local checker_pass = false

local dslings_checker_pass_config = {
["0.dslings-0"] = checker_pass,
Expand All @@ -94,6 +94,13 @@ task("dslings")
["2.range_for-1"] = checker_pass,
["2.range_for-2"] = checker_pass,
["2.range_for-3"] = checker_pass,
["3.array-0"] = checker_pass,
["3.array-1"] = checker_pass,
["3.array-2"] = checker_pass,
["3.array-3"] = checker_pass,
["3.array-4"] = checker_pass,
["3.array-5"] = checker_pass,
["3.array-6"] = checker_pass,
}

local function get_len(pairs_type)
Expand Down

0 comments on commit e82469a

Please sign in to comment.