From 03445c46a3233d46b9d8c235d9730be452437c7e Mon Sep 17 00:00:00 2001 From: Youwenqwq Date: Sun, 11 Jan 2026 22:09:25 +0800 Subject: [PATCH] Completed CXX exercises. --- exercises/00_hello_world/main.cpp | 2 +- exercises/01_variable&add/main.cpp | 2 +- exercises/02_function/main.cpp | 3 +- exercises/03_argument¶meter/main.cpp | 8 +-- exercises/04_static/main.cpp | 12 ++-- exercises/05_constexpr/main.cpp | 2 +- exercises/06_array/main.cpp | 4 +- exercises/07_loop/main.cpp | 6 +- exercises/08_pointer/main.cpp | 5 ++ exercises/09_enum&union/main.cpp | 3 +- exercises/10_trivial/main.cpp | 6 +- exercises/11_method/main.cpp | 4 +- exercises/12_method_const/main.cpp | 3 +- exercises/13_class/main.cpp | 4 +- exercises/14_class_destruct/main.cpp | 6 +- exercises/15_class_clone/main.cpp | 11 ++-- exercises/16_class_move/main.cpp | 23 +++++-- exercises/17_class_derive/main.cpp | 6 +- exercises/18_class_virtual/main.cpp | 40 +++++------ exercises/19_class_virtual_destruct/main.cpp | 28 ++++---- exercises/20_function_template/main.cpp | 5 +- exercises/21_runtime_datatype/main.cpp | 8 ++- exercises/22_class_template/main.cpp | 32 ++++++++- exercises/23_template_const/main.cpp | 5 ++ exercises/24_std_array/main.cpp | 16 ++--- exercises/25_std_vector/main.cpp | 66 +++++++++---------- exercises/26_std_vector_bool/main.cpp | 16 ++--- exercises/27_strides/main.cpp | 5 ++ exercises/28_std_string/main.cpp | 6 +- exercises/29_std_map/main.cpp | 2 + exercises/30_std_unique_ptr/main | Bin 0 -> 199512 bytes exercises/30_std_unique_ptr/main.cpp | 4 +- exercises/31_std_shared_ptr/main.cpp | 18 ++--- exercises/32_std_transform/main.cpp | 5 +- exercises/33_std_accumulate/main.cpp | 2 +- 35 files changed, 223 insertions(+), 145 deletions(-) create mode 100755 exercises/30_std_unique_ptr/main diff --git a/exercises/00_hello_world/main.cpp b/exercises/00_hello_world/main.cpp index 8866f3c15..fa454e132 100644 --- a/exercises/00_hello_world/main.cpp +++ b/exercises/00_hello_world/main.cpp @@ -6,6 +6,6 @@ int main(int argc, char **argv) { // TODO: 在控制台输出 "Hello, InfiniTensor!" 并换行 - std::cout : "Hello, InfiniTensor!" + std::endl; + std::cout << "Hello, InfiniTensor!" << std::endl; return 0; } diff --git a/exercises/01_variable&add/main.cpp b/exercises/01_variable&add/main.cpp index 5014863fd..315a25946 100644 --- a/exercises/01_variable&add/main.cpp +++ b/exercises/01_variable&add/main.cpp @@ -4,7 +4,7 @@ int main(int argc, char **argv) { // TODO: 补全变量定义并打印加法运算 - // x ? + int x = 114514; std::cout << x << " + " << x << " = " << x + x << std::endl; return 0; } diff --git a/exercises/02_function/main.cpp b/exercises/02_function/main.cpp index b5eef7f28..3d9a19820 100644 --- a/exercises/02_function/main.cpp +++ b/exercises/02_function/main.cpp @@ -5,6 +5,7 @@ // NOTICE: 补充由内而外读法的机翻解释 // TODO: 在这里声明函数 +int add(int a, int b); int main(int argc, char **argv) { ASSERT(add(123, 456) == 123 + 456, "add(123, 456) should be 123 + 456"); @@ -15,5 +16,5 @@ int main(int argc, char **argv) { } int add(int a, int b) { - // TODO: 补全函数定义,但不要移动代码行 + return a + b; } diff --git a/exercises/03_argument¶meter/main.cpp b/exercises/03_argument¶meter/main.cpp index 7fb5d3c2f..76136eae6 100644 --- a/exercises/03_argument¶meter/main.cpp +++ b/exercises/03_argument¶meter/main.cpp @@ -8,19 +8,19 @@ void func(int); // TODO: 为下列 ASSERT 填写正确的值 int main(int argc, char **argv) { auto arg = 99; - ASSERT(arg == ?, "arg should be ?"); + ASSERT(arg == 99, "arg should be ?"); std::cout << "befor func call: " << arg << std::endl; func(arg); - ASSERT(arg == ?, "arg should be ?"); + ASSERT(arg == 99, "arg should be ?"); std::cout << "after func call: " << arg << std::endl; return 0; } // TODO: 为下列 ASSERT 填写正确的值 void func(int param) { - ASSERT(param == ?, "param should be ?"); + ASSERT(param == 99, "param should be ?"); std::cout << "befor add: " << param << std::endl; param += 1; - ASSERT(param == ?, "param should be ?"); + ASSERT(param == 100, "param should be ?"); std::cout << "after add: " << param << std::endl; } diff --git a/exercises/04_static/main.cpp b/exercises/04_static/main.cpp index f107762fa..048e9ecaf 100644 --- a/exercises/04_static/main.cpp +++ b/exercises/04_static/main.cpp @@ -4,16 +4,16 @@ // THINK: 这个函数的两个 `static` 各自的作用是什么? static int func(int param) { static int static_ = param; - // std::cout << "static_ = " << static_ << std::endl; + std::cout << "static_ = " << static_ << std::endl; return static_++; } int main(int argc, char **argv) { // TODO: 将下列 `?` 替换为正确的数字 - ASSERT(func(5) == ?, "static variable value incorrect"); - ASSERT(func(4) == ?, "static variable value incorrect"); - ASSERT(func(3) == ?, "static variable value incorrect"); - ASSERT(func(2) == ?, "static variable value incorrect"); - ASSERT(func(1) == ?, "static variable value incorrect"); + ASSERT(func(5) == 5, "static variable value incorrect"); + ASSERT(func(4) == 6, "static variable value incorrect"); + ASSERT(func(3) == 7, "static variable value incorrect"); + ASSERT(func(2) == 8, "static variable value incorrect"); + ASSERT(func(1) == 9, "static variable value incorrect"); return 0; } diff --git a/exercises/05_constexpr/main.cpp b/exercises/05_constexpr/main.cpp index d1db6c9d8..68d222c0c 100644 --- a/exercises/05_constexpr/main.cpp +++ b/exercises/05_constexpr/main.cpp @@ -19,7 +19,7 @@ int main(int argc, char **argv) { // TODO: 观察错误信息,修改一处,使代码编译运行 // PS: 编译运行,但是不一定能算出结果…… constexpr auto ANS_N = 90; - constexpr auto ANS = fibonacci(ANS_N); + auto ANS = fibonacci(ANS_N); std::cout << "fibonacci(" << ANS_N << ") = " << ANS << std::endl; return 0; diff --git a/exercises/06_array/main.cpp b/exercises/06_array/main.cpp index 61ed99ec0..e3ec45fb2 100644 --- a/exercises/06_array/main.cpp +++ b/exercises/06_array/main.cpp @@ -11,13 +11,13 @@ unsigned long long fibonacci(int i) { return 1; default: // TODO: 补全三目表达式缺失的部分 - return ? : (arr[i] = fibonacci(i - 1) + fibonacci(i - 2)); + return arr[i] != 0 ? arr[i] : (arr[i] = fibonacci(i - 1) + fibonacci(i - 2)); } } int main(int argc, char **argv) { // TODO: 为此 ASSERT 填写正确的值 - ASSERT(sizeof(arr) == ?, "sizeof array is size of all its elements"); + ASSERT(sizeof(arr) == 720, "sizeof array is size of all its elements"); // ---- 不要修改以下代码 ---- ASSERT(fibonacci(2) == 1, "fibonacci(2) should be 1"); ASSERT(fibonacci(20) == 6765, "fibonacci(20) should be 6765"); diff --git a/exercises/07_loop/main.cpp b/exercises/07_loop/main.cpp index 44fd835cd..64074ca11 100644 --- a/exercises/07_loop/main.cpp +++ b/exercises/07_loop/main.cpp @@ -1,13 +1,13 @@ #include "../exercise.h" // TODO: 改正函数实现,实现正确的缓存优化斐波那契计算 -// THINk: 这个函数是一个纯函数(pure function)吗? +// THINk: 这个函数是一个纯函数(pure function)吗? YES // READ: 纯函数 static unsigned long long fibonacci(int i) { // TODO: 为缓存设置正确的初始值 - static unsigned long long cache[96], cached; + static unsigned long long cache[96] = {0,1}, cached = 2; // TODO: 设置正确的循环条件 - for (; false; ++cached) { + for (; i >= cached && cached < 96; ++cached) { cache[cached] = cache[cached - 1] + cache[cached - 2]; } return cache[i]; diff --git a/exercises/08_pointer/main.cpp b/exercises/08_pointer/main.cpp index ba37173f5..2acd37a5b 100644 --- a/exercises/08_pointer/main.cpp +++ b/exercises/08_pointer/main.cpp @@ -5,6 +5,11 @@ bool is_fibonacci(int *ptr, int len, int stride) { ASSERT(len >= 3, "`len` should be at least 3"); // TODO: 编写代码判断从 ptr 开始,每 stride 个元素取 1 个元素,组成长度为 n 的数列是否满足 // arr[i + 2] = arr[i] + arr[i + 1] + for (int i = 2*stride; i/stride < len; i+=stride) { + if (ptr[i] != ptr[i-stride] + ptr[i-2*stride]){ + return false; + } + } return true; } diff --git a/exercises/09_enum&union/main.cpp b/exercises/09_enum&union/main.cpp index 3f2cec768..867cdb870 100644 --- a/exercises/09_enum&union/main.cpp +++ b/exercises/09_enum&union/main.cpp @@ -1,4 +1,5 @@ #include "../exercise.h" +#include // READ: 枚举类型 @@ -37,7 +38,7 @@ ColorEnum convert_by_pun(Color c) { TypePun pun; // TODO: 补全类型双关转换 - + pun.c = c; return pun.e; } diff --git a/exercises/10_trivial/main.cpp b/exercises/10_trivial/main.cpp index 6ba23e48e..a516c11f6 100644 --- a/exercises/10_trivial/main.cpp +++ b/exercises/10_trivial/main.cpp @@ -9,8 +9,8 @@ struct FibonacciCache { // TODO: 实现正确的缓存优化斐波那契计算 static unsigned long long fibonacci(FibonacciCache &cache, int i) { - for (; false; ++cached) { - cache[cached] = cache[cached - 1] + cache[cached - 2]; + for (; cache.cached <= i; ++cache.cached) { + cache.cache[cache.cached] = cache.cache[cache.cached - 1] + cache.cache[cache.cached - 2]; } return cache.cache[i]; } @@ -19,7 +19,7 @@ int main(int argc, char **argv) { // TODO: 初始化缓存结构体,使计算正确 // NOTICE: C/C++ 中,读取未初始化的变量(包括结构体变量)是未定义行为 // READ: 初始化的各种写法 - FibonacciCache fib; + FibonacciCache fib{{0,1},2}; ASSERT(fibonacci(fib, 10) == 55, "fibonacci(10) should be 55"); std::cout << "fibonacci(10) = " << fibonacci(fib, 10) << std::endl; return 0; diff --git a/exercises/11_method/main.cpp b/exercises/11_method/main.cpp index 0e08e0a36..a76ed7219 100644 --- a/exercises/11_method/main.cpp +++ b/exercises/11_method/main.cpp @@ -6,7 +6,7 @@ struct Fibonacci { // TODO: 实现正确的缓存优化斐波那契计算 unsigned long long get(int i) { - for (; false; ++cached) { + for (; cached <= i; ++cached) { cache[cached] = cache[cached - 1] + cache[cached - 2]; } return cache[i]; @@ -15,7 +15,7 @@ struct Fibonacci { int main(int argc, char **argv) { // TODO: 初始化缓存结构体,使计算正确 - Fibonacci fib; + Fibonacci fib{{0,1}, 2}; ASSERT(fib.get(10) == 55, "fibonacci(10) should be 55"); std::cout << "fibonacci(10) = " << fib.get(10) << std::endl; return 0; diff --git a/exercises/12_method_const/main.cpp b/exercises/12_method_const/main.cpp index 5521be4da..65c079be1 100644 --- a/exercises/12_method_const/main.cpp +++ b/exercises/12_method_const/main.cpp @@ -5,7 +5,8 @@ struct Fibonacci { int numbers[11]; // TODO: 修改方法签名和实现,使测试通过 - int get(int i) { + int get(int i) const { + return numbers[i]; } }; diff --git a/exercises/13_class/main.cpp b/exercises/13_class/main.cpp index 9afa98c5b..64cb330b8 100644 --- a/exercises/13_class/main.cpp +++ b/exercises/13_class/main.cpp @@ -14,11 +14,11 @@ class Fibonacci { public: // TODO: 实现构造器 - // Fibonacci() + Fibonacci() : cache{0, 1}, cached(2) {} // TODO: 实现正确的缓存优化斐波那契计算 size_t get(int i) { - for (; false; ++cached) { + for (; cached <= i; ++cached) { cache[cached] = cache[cached - 1] + cache[cached - 2]; } return cache[i]; diff --git a/exercises/14_class_destruct/main.cpp b/exercises/14_class_destruct/main.cpp index 42150e8ca..86a6d814d 100644 --- a/exercises/14_class_destruct/main.cpp +++ b/exercises/14_class_destruct/main.cpp @@ -11,14 +11,14 @@ class DynFibonacci { public: // TODO: 实现动态设置容量的构造器 - DynFibonacci(int capacity): cache(new ?), cached(?) {} + DynFibonacci(int capacity): cache(new size_t[capacity]{0, 1}), cached(2) {} // TODO: 实现析构器,释放缓存空间 - ~DynFibonacci(); + ~DynFibonacci() {delete[] cache;}; // TODO: 实现正确的缓存优化斐波那契计算 size_t get(int i) { - for (; false; ++cached) { + for (; cached <= i; ++cached) { cache[cached] = cache[cached - 1] + cache[cached - 2]; } return cache[i]; diff --git a/exercises/15_class_clone/main.cpp b/exercises/15_class_clone/main.cpp index f74b70391..f249f2158 100644 --- a/exercises/15_class_clone/main.cpp +++ b/exercises/15_class_clone/main.cpp @@ -10,17 +10,20 @@ class DynFibonacci { public: // TODO: 实现动态设置容量的构造器 - DynFibonacci(int capacity): cache(new ?), cached(?) {} + DynFibonacci(int capacity): cache(new size_t[capacity]{0, 1}), cached(2) {} // TODO: 实现复制构造器 - DynFibonacci(DynFibonacci const &) = delete; + DynFibonacci(DynFibonacci const &other) + : cache(new size_t[other.cached + 1]), cached(other.cached) { + std::copy(other.cache, other.cache + other.cached + 1, cache); + } // TODO: 实现析构器,释放缓存空间 - ~DynFibonacci(); + ~DynFibonacci() {delete[] cache;}; // TODO: 实现正确的缓存优化斐波那契计算 size_t get(int i) { - for (; false; ++cached) { + for (; cached <= i; ++cached) { cache[cached] = cache[cached - 1] + cache[cached - 2]; } return cache[i]; diff --git a/exercises/16_class_move/main.cpp b/exercises/16_class_move/main.cpp index 8d2c421da..a68e6894c 100644 --- a/exercises/16_class_move/main.cpp +++ b/exercises/16_class_move/main.cpp @@ -15,21 +15,34 @@ class DynFibonacci { public: // TODO: 实现动态设置容量的构造器 - DynFibonacci(int capacity): cache(new ?), cached(?) {} + DynFibonacci(int capacity): cache(new size_t[capacity]{0, 1}), cached(2) {} // TODO: 实现移动构造器 - DynFibonacci(DynFibonacci &&) noexcept = delete; + DynFibonacci(DynFibonacci &&other) noexcept + : cache(other.cache), cached(other.cached) { + other.cache = nullptr; + other.cached = 0; + } // TODO: 实现移动赋值 // NOTICE: ⚠ 注意移动到自身问题 ⚠ - DynFibonacci &operator=(DynFibonacci &&) noexcept = delete; + DynFibonacci &operator=(DynFibonacci &&other) noexcept { + if (this != &other) { + delete[] cache; + cache = other.cache; + cached = other.cached; + other.cache = nullptr; + other.cached = 0; + } + return *this; + } // TODO: 实现析构器,释放缓存空间 - ~DynFibonacci(); + ~DynFibonacci() {delete[] cache;}; // TODO: 实现正确的缓存优化斐波那契计算 size_t operator[](int i) { - for (; false; ++cached) { + for (; cached <= i; ++cached) { cache[cached] = cache[cached - 1] + cache[cached - 2]; } return cache[i]; diff --git a/exercises/17_class_derive/main.cpp b/exercises/17_class_derive/main.cpp index 819ae72fc..befa0ed7d 100644 --- a/exercises/17_class_derive/main.cpp +++ b/exercises/17_class_derive/main.cpp @@ -50,9 +50,9 @@ int main(int argc, char **argv) { B b = B(3); // TODO: 补全三个类型的大小 - static_assert(sizeof(X) == ?, "There is an int in X"); - static_assert(sizeof(A) == ?, "There is an int in A"); - static_assert(sizeof(B) == ?, "B is an A with an X"); + static_assert(sizeof(X) == sizeof(int), "There is an int in X"); + static_assert(sizeof(A) == sizeof(int), "There is an int in A"); + static_assert(sizeof(B) == sizeof(A) + sizeof(X), "B is an A with an X"); i = 0; std::cout << std::endl diff --git a/exercises/18_class_virtual/main.cpp b/exercises/18_class_virtual/main.cpp index ac6382413..344709e4c 100644 --- a/exercises/18_class_virtual/main.cpp +++ b/exercises/18_class_virtual/main.cpp @@ -42,38 +42,38 @@ int main(int argc, char **argv) { C c; D d; - ASSERT(a.virtual_name() == '?', MSG); - ASSERT(b.virtual_name() == '?', MSG); - ASSERT(c.virtual_name() == '?', MSG); - ASSERT(d.virtual_name() == '?', MSG); - ASSERT(a.direct_name() == '?', MSG); - ASSERT(b.direct_name() == '?', MSG); - ASSERT(c.direct_name() == '?', MSG); - ASSERT(d.direct_name() == '?', MSG); + ASSERT(a.virtual_name() == 'A', MSG); + ASSERT(b.virtual_name() == 'B', MSG); + ASSERT(c.virtual_name() == 'C', MSG); + ASSERT(d.virtual_name() == 'C', MSG); + ASSERT(a.direct_name() == 'A', MSG); + ASSERT(b.direct_name() == 'B', MSG); + ASSERT(c.direct_name() == 'C', MSG); + ASSERT(d.direct_name() == 'D', MSG); A &rab = b; B &rbc = c; C &rcd = d; - ASSERT(rab.virtual_name() == '?', MSG); - ASSERT(rbc.virtual_name() == '?', MSG); - ASSERT(rcd.virtual_name() == '?', MSG); - ASSERT(rab.direct_name() == '?', MSG); - ASSERT(rbc.direct_name() == '?', MSG); - ASSERT(rcd.direct_name() == '?', MSG); + ASSERT(rab.virtual_name() == 'B', MSG); + ASSERT(rbc.virtual_name() == 'C', MSG); + ASSERT(rcd.virtual_name() == 'C', MSG); + ASSERT(rab.direct_name() == 'A', MSG); + ASSERT(rbc.direct_name() == 'B', MSG); + ASSERT(rcd.direct_name() == 'C', MSG); A &rac = c; B &rbd = d; - ASSERT(rac.virtual_name() == '?', MSG); - ASSERT(rbd.virtual_name() == '?', MSG); - ASSERT(rac.direct_name() == '?', MSG); - ASSERT(rbd.direct_name() == '?', MSG); + ASSERT(rac.virtual_name() == 'C', MSG); + ASSERT(rbd.virtual_name() == 'C', MSG); + ASSERT(rac.direct_name() == 'A', MSG); + ASSERT(rbd.direct_name() == 'B', MSG); A &rad = d; - ASSERT(rad.virtual_name() == '?', MSG); - ASSERT(rad.direct_name() == '?', MSG); + ASSERT(rad.virtual_name() == 'C', MSG); + ASSERT(rad.direct_name() == 'A', MSG); return 0; } diff --git a/exercises/19_class_virtual_destruct/main.cpp b/exercises/19_class_virtual_destruct/main.cpp index cdd54f74f..300fec8cd 100644 --- a/exercises/19_class_virtual_destruct/main.cpp +++ b/exercises/19_class_virtual_destruct/main.cpp @@ -2,15 +2,14 @@ // READ: 静态字段 // READ: 虚析构函数 - struct A { // TODO: 正确初始化静态字段 - static int num_a = 0; + static int num_a; A() { ++num_a; } - ~A() { + virtual ~A() { --num_a; } @@ -20,7 +19,7 @@ struct A { }; struct B final : public A { // TODO: 正确初始化静态字段 - static int num_b = 0; + static int num_b; B() { ++num_b; @@ -34,13 +33,16 @@ struct B final : public A { } }; +int A::num_a = 0; +int B::num_b = 0; + int main(int argc, char **argv) { auto a = new A; auto b = new B; - ASSERT(A::num_a == ?, "Fill in the correct value for A::num_a"); - ASSERT(B::num_b == ?, "Fill in the correct value for B::num_b"); - ASSERT(a->name() == '?', "Fill in the correct value for a->name()"); - ASSERT(b->name() == '?', "Fill in the correct value for b->name()"); + ASSERT(A::num_a == 2, "Fill in the correct value for A::num_a"); + ASSERT(B::num_b == 1, "Fill in the correct value for B::num_b"); + ASSERT(a->name() == 'A', "Fill in the correct value for a->name()"); + ASSERT(b->name() == 'B', "Fill in the correct value for b->name()"); delete a; delete b; @@ -48,13 +50,13 @@ int main(int argc, char **argv) { ASSERT(B::num_b == 0, "Every B was destroyed"); A *ab = new B;// 派生类指针可以随意转换为基类指针 - ASSERT(A::num_a == ?, "Fill in the correct value for A::num_a"); - ASSERT(B::num_b == ?, "Fill in the correct value for B::num_b"); - ASSERT(ab->name() == '?', "Fill in the correct value for ab->name()"); + ASSERT(A::num_a == 1, "Fill in the correct value for A::num_a"); + ASSERT(B::num_b == 1, "Fill in the correct value for B::num_b"); + ASSERT(ab->name() == 'B', "Fill in the correct value for ab->name()"); // TODO: 基类指针无法随意转换为派生类指针,补全正确的转换语句 - B &bb = *ab; - ASSERT(bb.name() == '?', "Fill in the correct value for bb->name()"); + B &bb = dynamic_cast(*ab); + ASSERT(bb.name() == 'B', "Fill in the correct value for bb->name()"); // TODO: ---- 以下代码不要修改,通过改正类定义解决编译问题 ---- delete ab;// 通过指针可以删除指向的对象,即使是多态对象 diff --git a/exercises/20_function_template/main.cpp b/exercises/20_function_template/main.cpp index cb6d978d3..8f998c4e0 100644 --- a/exercises/20_function_template/main.cpp +++ b/exercises/20_function_template/main.cpp @@ -2,7 +2,8 @@ // READ: 函数模板 // TODO: 将这个函数模板化 -int plus(int a, int b) { +template +T plus(T a, T b) { return a + b; } @@ -14,7 +15,7 @@ int main(int argc, char **argv) { ASSERT(plus(1.25f, 2.5f) == 3.75f, "Plus two float"); ASSERT(plus(1.25, 2.5) == 3.75, "Plus two double"); // TODO: 修改判断条件使测试通过 - ASSERT(plus(0.1, 0.2) == 0.3, "How to make this pass?"); + ASSERT(std::abs(plus(0.1, 0.2) - 0.3) < 1e-9, "How to make this pass?"); return 0; } diff --git a/exercises/21_runtime_datatype/main.cpp b/exercises/21_runtime_datatype/main.cpp index 9c4bf376a..71d7b433d 100644 --- a/exercises/21_runtime_datatype/main.cpp +++ b/exercises/21_runtime_datatype/main.cpp @@ -18,13 +18,19 @@ struct TaggedUnion { }; // TODO: 将这个函数模板化用于 sigmoid_dyn -float sigmoid(float x) { +template +T sigmoid(T x) { return 1 / (1 + std::exp(-x)); } TaggedUnion sigmoid_dyn(TaggedUnion x) { TaggedUnion ans{x.type}; // TODO: 根据 type 调用 sigmoid + if (x.type == DataType::Float) { + ans.f = sigmoid(x.f); + } else if (x.type == DataType::Double) { + ans.d = sigmoid(x.d); + } return ans; } diff --git a/exercises/22_class_template/main.cpp b/exercises/22_class_template/main.cpp index d4985d904..977352d5a 100644 --- a/exercises/22_class_template/main.cpp +++ b/exercises/22_class_template/main.cpp @@ -10,6 +10,10 @@ struct Tensor4D { Tensor4D(unsigned int const shape_[4], T const *data_) { unsigned int size = 1; // TODO: 填入正确的 shape 并计算 size + for (int i = 0; i < 4; ++i) { + shape[i] = shape_[i]; + size *= shape[i]; + } data = new T[size]; std::memcpy(data, data_, size * sizeof(T)); } @@ -27,7 +31,33 @@ struct Tensor4D { // 例如,`this` 形状为 `[1, 2, 3, 4]`,`others` 形状为 `[1, 2, 1, 4]`, // 则 `this` 与 `others` 相加时,3 个形状为 `[1, 2, 1, 4]` 的子张量各自与 `others` 对应项相加。 Tensor4D &operator+=(Tensor4D const &others) { - // TODO: 实现单向广播的加法 + for (int i = 0; i < 4; ++i) { + ASSERT(others.shape[i] == 1 || others.shape[i] == shape[i], "Shape mismatch for broadcasting"); + } + + unsigned int size = 1; + for (int i = 0; i < 4; ++i) { + size *= shape[i]; + } + + for (unsigned int i = 0; i < size; ++i) { + unsigned int idx[4]; + unsigned int temp = i; + for (int j = 3; j >= 0; --j) { + idx[j] = temp % shape[j]; + temp /= shape[j]; + } + + unsigned int other_idx = 0; + unsigned int stride = 1; + for (int j = 3; j >= 0; --j) { + other_idx += (others.shape[j] == 1 ? 0 : idx[j]) * stride; + stride *= others.shape[j]; + } + + data[i] += others.data[other_idx]; + } + return *this; } }; diff --git a/exercises/23_template_const/main.cpp b/exercises/23_template_const/main.cpp index e0105e168..d6103efe4 100644 --- a/exercises/23_template_const/main.cpp +++ b/exercises/23_template_const/main.cpp @@ -11,6 +11,10 @@ struct Tensor { Tensor(unsigned int const shape_[N]) { unsigned int size = 1; // TODO: 填入正确的 shape 并计算 size + for (unsigned int i = 0; i < N; ++i) { + shape[i] = shape_[i]; + size *= shape[i]; + } data = new T[size]; std::memset(data, 0, size * sizeof(T)); } @@ -35,6 +39,7 @@ struct Tensor { for (unsigned int i = 0; i < N; ++i) { ASSERT(indices[i] < shape[i], "Invalid index"); // TODO: 计算 index + index = index * shape[i] + indices[i]; } return index; } diff --git a/exercises/24_std_array/main.cpp b/exercises/24_std_array/main.cpp index c29718d9d..1130c998f 100644 --- a/exercises/24_std_array/main.cpp +++ b/exercises/24_std_array/main.cpp @@ -8,21 +8,21 @@ int main(int argc, char **argv) { { std::array arr{{1, 2, 3, 4, 5}}; - ASSERT(arr.size() == ?, "Fill in the correct value."); - ASSERT(sizeof(arr) == ?, "Fill in the correct value."); + ASSERT(arr.size() == 5, "Fill in the correct value."); + ASSERT(sizeof(arr) == 20, "Fill in the correct value."); int ans[]{1, 2, 3, 4, 5}; - ASSERT(std::memcmp(arr.?, ans, ?) == 0, "Fill in the correct values."); + ASSERT(std::memcmp(arr.data(), ans, sizeof(ans)) == 0, "Fill in the correct values."); } { std::array arr; - ASSERT(arr.size() == ?, "Fill in the correct value."); - ASSERT(sizeof(arr) == ?, "Fill in the correct value."); + ASSERT(arr.size() == 8, "Fill in the correct value."); + ASSERT(sizeof(arr) == 64, "Fill in the correct value."); } { std::array arr{"Hello, InfiniTensor!"}; - ASSERT(arr.size() == ?, "Fill in the correct value."); - ASSERT(sizeof(arr) == ?, "Fill in the correct value."); - ASSERT(std::strcmp(arr.?, "Hello, InfiniTensor!") == 0, "Fill in the correct value."); + ASSERT(arr.size() == 21, "Fill in the correct value."); + ASSERT(sizeof(arr) == 21, "Fill in the correct value."); + ASSERT(std::strcmp(arr.data(), "Hello, InfiniTensor!") == 0, "Fill in the correct value."); } return 0; } diff --git a/exercises/25_std_vector/main.cpp b/exercises/25_std_vector/main.cpp index f9e41bb78..7d88c4a9a 100644 --- a/exercises/25_std_vector/main.cpp +++ b/exercises/25_std_vector/main.cpp @@ -8,81 +8,81 @@ int main(int argc, char **argv) { { std::vector vec{1, 2, 3, 4, 5}; - ASSERT(vec.size() == ?, "Fill in the correct value."); + ASSERT(vec.size() == 5, "Fill in the correct value."); // THINK: `std::vector` 的大小是什么意思?与什么有关? - ASSERT(sizeof(vec) == ?, "Fill in the correct value."); + ASSERT(sizeof(vec) == sizeof(std::vector), "Fill in the correct value."); int ans[]{1, 2, 3, 4, 5}; - ASSERT(std::memcmp(vec.?, ans, sizeof(ans)) == 0, "Fill in the correct values."); + ASSERT(std::memcmp(vec.data(), ans, sizeof(ans)) == 0, "Fill in the correct values."); } { std::vector vec{1, 2, 3, 4, 5}; { - ASSERT(vec.size() == ?, "Fill in the correct value."); - ASSERT(sizeof(vec) == ?, "Fill in the correct value."); + ASSERT(vec.size() == 5, "Fill in the correct value."); + ASSERT(sizeof(vec) == sizeof(std::vector), "Fill in the correct value."); double ans[]{1, 2, 3, 4, 5}; - ASSERT(std::memcmp(vec.?, ans, sizeof(ans)) == 0, "Fill in the correct values."); + ASSERT(std::memcmp(vec.data(), ans, sizeof(ans)) == 0, "Fill in the correct values."); } { vec.push_back(6); - ASSERT(vec.size() == ?, "Fill in the correct value."); - ASSERT(sizeof(vec) == ?, "Fill in the correct value."); + ASSERT(vec.size() == 6, "Fill in the correct value."); + ASSERT(sizeof(vec) == sizeof(std::vector), "Fill in the correct value."); vec.pop_back(); - ASSERT(vec.size() == ?, "Fill in the correct value."); - ASSERT(sizeof(vec) == ?, "Fill in the correct value."); + ASSERT(vec.size() == 5, "Fill in the correct value."); + ASSERT(sizeof(vec) == sizeof(std::vector), "Fill in the correct value."); } { vec[4] = 6; - ASSERT(vec[0] == ?, "Fill in the correct value."); - ASSERT(vec[1] == ?, "Fill in the correct value."); - ASSERT(vec[2] == ?, "Fill in the correct value."); - ASSERT(vec[3] == ?, "Fill in the correct value."); - ASSERT(vec[4] == ?, "Fill in the correct value."); + ASSERT(vec[0] == 1, "Fill in the correct value."); + ASSERT(vec[1] == 2, "Fill in the correct value."); + ASSERT(vec[2] == 3, "Fill in the correct value."); + ASSERT(vec[3] == 4, "Fill in the correct value."); + ASSERT(vec[4] == 6, "Fill in the correct value."); } { // THINK: `std::vector` 插入删除的时间复杂度是什么? - vec.insert(?, 1.5); + vec.insert(vec.begin() + 1, 1.5); ASSERT((vec == std::vector{1, 1.5, 2, 3, 4, 6}), "Make this assertion pass."); - vec.erase(?); + vec.erase(vec.begin() + 3); ASSERT((vec == std::vector{1, 1.5, 2, 4, 6}), "Make this assertion pass."); } { vec.shrink_to_fit(); - ASSERT(vec.capacity() == ?, "Fill in the correct value."); + ASSERT(vec.capacity() == vec.size(), "Fill in the correct value."); vec.clear(); ASSERT(vec.empty(), "`vec` is empty now."); - ASSERT(vec.size() == ?, "Fill in the correct value."); - ASSERT(vec.capacity() == ?, "Fill in the correct value."); + ASSERT(vec.size() == 0, "Fill in the correct value."); + ASSERT(vec.capacity() == 5, "Fill in the correct value."); } } { - std::vector vec(?, ?); // TODO: 调用正确的构造函数 + std::vector vec(48, 'z'); // TODO: 调用正确的构造函数 ASSERT(vec[0] == 'z', "Make this assertion pass."); ASSERT(vec[47] == 'z', "Make this assertion pass."); ASSERT(vec.size() == 48, "Make this assertion pass."); - ASSERT(sizeof(vec) == ?, "Fill in the correct value."); + ASSERT(sizeof(vec) == sizeof(std::vector), "Fill in the correct value."); { auto capacity = vec.capacity(); vec.resize(16); - ASSERT(vec.size() == ?, "Fill in the correct value."); - ASSERT(vec.capacity() == ?, "Fill in a correct identifier."); + ASSERT(vec.size() == 16, "Fill in the correct value."); + ASSERT(vec.capacity() == capacity, "Fill in a correct identifier."); } { vec.reserve(256); - ASSERT(vec.size() == ?, "Fill in the correct value."); - ASSERT(vec.capacity() == ?, "Fill in the correct value."); + ASSERT(vec.size() == 16, "Fill in the correct value."); + ASSERT(vec.capacity() == 256, "Fill in the correct value."); } { vec.push_back('a'); vec.push_back('b'); vec.push_back('c'); vec.push_back('d'); - ASSERT(vec.size() == ?, "Fill in the correct value."); - ASSERT(vec.capacity() == ?, "Fill in the correct value."); - ASSERT(vec[15] == ?, "Fill in the correct value."); - ASSERT(vec[?] == 'a', "Fill in the correct value."); - ASSERT(vec[?] == 'b', "Fill in the correct value."); - ASSERT(vec[?] == 'c', "Fill in the correct value."); - ASSERT(vec[?] == 'd', "Fill in the correct value."); + ASSERT(vec.size() == 20, "Fill in the correct value."); + ASSERT(vec.capacity() == 256, "Fill in the correct value."); + ASSERT(vec[15] == 'z', "Fill in the correct value."); + ASSERT(vec[16] == 'a', "Fill in the correct value."); + ASSERT(vec[17] == 'b', "Fill in the correct value."); + ASSERT(vec[18] == 'c', "Fill in the correct value."); + ASSERT(vec[19] == 'd', "Fill in the correct value."); } } diff --git a/exercises/26_std_vector_bool/main.cpp b/exercises/26_std_vector_bool/main.cpp index b4ab4f9c4..972a80b08 100644 --- a/exercises/26_std_vector_bool/main.cpp +++ b/exercises/26_std_vector_bool/main.cpp @@ -6,29 +6,29 @@ // TODO: 将下列 `?` 替换为正确的代码 int main(int argc, char **argv) { - std::vector vec(?, ?);// TODO: 正确调用构造函数 + std::vector vec(100, true);// TODO: 正确调用构造函数 ASSERT(vec[0], "Make this assertion pass."); ASSERT(vec[99], "Make this assertion pass."); ASSERT(vec.size() == 100, "Make this assertion pass."); // NOTICE: 平台相关!注意 CI:Ubuntu 上的值。 std::cout << "sizeof(std::vector) = " << sizeof(std::vector) << std::endl; - ASSERT(sizeof(vec) == ?, "Fill in the correct value."); + ASSERT(sizeof(vec) == sizeof(std::vector), "Fill in the correct value."); { vec[20] = false; - ASSERT(?vec[20], "Fill in `vec[20]` or `!vec[20]`."); + ASSERT(!vec[20], "Fill in `vec[20]` or `!vec[20]`."); } { vec.push_back(false); - ASSERT(vec.size() == ?, "Fill in the correct value."); - ASSERT(?vec[100], "Fill in `vec[100]` or `!vec[100]`."); + ASSERT(vec.size() == 101, "Fill in the correct value."); + ASSERT(!vec[100], "Fill in `vec[100]` or `!vec[100]`."); } { auto ref = vec[30]; - ASSERT(?ref, "Fill in `ref` or `!ref`"); + ASSERT(ref, "Fill in `ref` or `!ref`"); ref = false; - ASSERT(?ref, "Fill in `ref` or `!ref`"); + ASSERT(!ref, "Fill in `ref` or `!ref`"); // THINK: WHAT and WHY? - ASSERT(?vec[30], "Fill in `vec[30]` or `!vec[30]`."); + ASSERT(!vec[30], "Fill in `vec[30]` or `!vec[30]`."); } return 0; } diff --git a/exercises/27_strides/main.cpp b/exercises/27_strides/main.cpp index baceaf2a9..0974fced8 100644 --- a/exercises/27_strides/main.cpp +++ b/exercises/27_strides/main.cpp @@ -18,6 +18,11 @@ std::vector strides(std::vector const &shape) { // TODO: 完成函数体,根据张量形状计算张量连续存储时的步长。 // READ: 逆向迭代器 std::vector::rbegin // 使用逆向迭代器可能可以简化代码 + udim stride = 1; + for (int i = shape.size() - 1; i >= 0; --i) { + strides[i] = stride; + stride *= shape[i]; + } return strides; } diff --git a/exercises/28_std_string/main.cpp b/exercises/28_std_string/main.cpp index d8b276274..5fcfdf31d 100644 --- a/exercises/28_std_string/main.cpp +++ b/exercises/28_std_string/main.cpp @@ -10,9 +10,9 @@ int main(int argc, char **argv) { auto world = "world"; // READ: `decltype` 表达式 // READ: `std::is_same_v` 元编程判别 - ASSERT((std::is_same_v), "Fill in the missing type."); - ASSERT((std::is_same_v), "Fill in the missing type."); + ASSERT((std::is_same_v), "Fill in the missing type."); + ASSERT((std::is_same_v), "Fill in the missing type."); // TODO: 将 `?` 替换为正确的字符串 - ASSERT(hello + ", " + world + '!' == "?", "Fill in the missing string."); + ASSERT(hello + ", " + world + '!' == "Hello, world!", "Fill in the missing string."); return 0; } diff --git a/exercises/29_std_map/main.cpp b/exercises/29_std_map/main.cpp index fcccca347..68122a5fc 100644 --- a/exercises/29_std_map/main.cpp +++ b/exercises/29_std_map/main.cpp @@ -7,11 +7,13 @@ template bool key_exists(std::map const &map, k const &key) { // TODO: 实现函数 + return map.find(key) != map.end(); } template void set(std::map &map, k key, v value) { // TODO: 实现函数 + map[key] = value; } // ---- 不要修改以下代码 ---- diff --git a/exercises/30_std_unique_ptr/main b/exercises/30_std_unique_ptr/main new file mode 100755 index 0000000000000000000000000000000000000000..97f0cc4015d54c362336a272a51b5cf228326291 GIT binary patch literal 199512 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 G@c#qDa36yJ literal 0 HcmV?d00001 diff --git a/exercises/30_std_unique_ptr/main.cpp b/exercises/30_std_unique_ptr/main.cpp index 9b98b5794..d525f00c7 100644 --- a/exercises/30_std_unique_ptr/main.cpp +++ b/exercises/30_std_unique_ptr/main.cpp @@ -53,8 +53,8 @@ int main(int argc, char **argv) { {"fd"}, // TODO: 分析 problems[1] 中资源的生命周期,将记录填入 `std::vector` // NOTICE: 此题结果依赖对象析构逻辑,平台相关,提交时以 CI 实际运行平台为准 - {"", "", "", "", "", "", "", ""}, - {"", "", "", "", "", "", "", ""}, + {"d", "ffr"}, + {"d", "d", "r"}, }; // ---- 不要修改以下代码 ---- diff --git a/exercises/31_std_shared_ptr/main.cpp b/exercises/31_std_shared_ptr/main.cpp index febbbcc6f..d35134457 100644 --- a/exercises/31_std_shared_ptr/main.cpp +++ b/exercises/31_std_shared_ptr/main.cpp @@ -10,36 +10,36 @@ int main(int argc, char **argv) { std::shared_ptr ptrs[]{shared, shared, shared}; std::weak_ptr observer = shared; - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 4, ""); ptrs[0].reset(); - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 3, ""); ptrs[1] = nullptr; - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 2, ""); ptrs[2] = std::make_shared(*shared); - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 1, ""); ptrs[0] = shared; ptrs[1] = shared; ptrs[2] = std::move(shared); - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 3, ""); std::ignore = std::move(ptrs[0]); ptrs[1] = std::move(ptrs[1]); ptrs[1] = std::move(ptrs[2]); - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 2, ""); shared = observer.lock(); - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 3, ""); shared = nullptr; for (auto &ptr : ptrs) ptr = nullptr; - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 0, ""); shared = observer.lock(); - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 0, ""); return 0; } diff --git a/exercises/32_std_transform/main.cpp b/exercises/32_std_transform/main.cpp index f4dc25a5c..94b90e93e 100644 --- a/exercises/32_std_transform/main.cpp +++ b/exercises/32_std_transform/main.cpp @@ -9,7 +9,10 @@ int main(int argc, char **argv) { std::vector val{8, 13, 21, 34, 55}; // TODO: 调用 `std::transform`,将 `v` 中的每个元素乘以 2,并转换为字符串,存入 `ans` - // std::vector ans + std::vector ans; + std::transform(val.begin(), val.end(), std::back_inserter(ans), [](int x) { + return std::to_string(x * 2); + }); ASSERT(ans.size() == val.size(), "ans size should be equal to val size"); ASSERT(ans[0] == "16", "ans[0] should be 16"); ASSERT(ans[1] == "26", "ans[1] should be 26"); diff --git a/exercises/33_std_accumulate/main.cpp b/exercises/33_std_accumulate/main.cpp index 6326929d5..06ade46ed 100644 --- a/exercises/33_std_accumulate/main.cpp +++ b/exercises/33_std_accumulate/main.cpp @@ -11,7 +11,7 @@ int main(int argc, char **argv) { // - 形状为 shape; // - 连续存储; // 的张量占用的字节数 - // int size = + int size = std::accumulate(std::begin(shape), std::end(shape), sizeof(DataType), std::multiplies()); ASSERT(size == 602112, "4x1x3x224x224 = 602112"); return 0; }