Skip to content

Commit c248b13

Browse files
committed
update: 完成 25 题
Signed-off-by: YdrMaster <[email protected]>
1 parent a2241cc commit c248b13

File tree

9 files changed

+202
-2
lines changed

9 files changed

+202
-2
lines changed

exercises/23_std_vector/main.cpp

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
#include "../exercise.h"
2+
#include <vector>
3+
4+
// READ: std::vector <https://zh.cppreference.com/w/cpp/container/vector>
5+
6+
// TODO: 将下列 `?` 替换为正确的代码
7+
int main(int argc, char **argv) {
8+
{
9+
std::vector<int> vec{1, 2, 3, 4, 5};
10+
ASSERT(vec.size() == ?, "Fill in the correct value.");
11+
ASSERT(sizeof(vec) == ?, "Fill in the correct value.");
12+
int ans[]{1, 2, 3, 4, 5};
13+
ASSERT(std::memcmp(vec.?, ans, sizeof(ans)) == 0, "Fill in the correct values.");
14+
}
15+
{
16+
std::vector<double> vec{1, 2, 3, 4, 5};
17+
{
18+
ASSERT(vec.size() == ?, "Fill in the correct value.");
19+
ASSERT(sizeof(vec) == ?, "Fill in the correct value.");
20+
double ans[]{1, 2, 3, 4, 5};
21+
ASSERT(std::memcmp(vec.?, ans, sizeof(ans)) == 0, "Fill in the correct values.");
22+
}
23+
{
24+
vec.push_back(6);
25+
ASSERT(vec.size() == ?, "Fill in the correct value.");
26+
ASSERT(sizeof(vec) == ?, "Fill in the correct value.");
27+
vec.pop_back();
28+
ASSERT(vec.size() == ?, "Fill in the correct value.");
29+
ASSERT(sizeof(vec) == ?, "Fill in the correct value.");
30+
}
31+
{
32+
vec[4] = 6;
33+
ASSERT(vec[0] == ?, "Fill in the correct value.");
34+
ASSERT(vec[1] == ?, "Fill in the correct value.");
35+
ASSERT(vec[2] == ?, "Fill in the correct value.");
36+
ASSERT(vec[3] == ?, "Fill in the correct value.");
37+
ASSERT(vec[4] == ?, "Fill in the correct value.");
38+
}
39+
{
40+
// THINK: `std::vector` 插入删除的时间复杂度是什么?
41+
vec.insert(?, 1.5);
42+
ASSERT((vec == std::vector<double>{1, 1.5, 2, 3, 4, 6}), "Make this assertion pass.");
43+
vec.erase(?);
44+
ASSERT((vec == std::vector<double>{1, 1.5, 2, 4, 6}), "Make this assertion pass.");
45+
}
46+
{
47+
vec.shrink_to_fit();
48+
ASSERT(vec.capacity() == ?, "Fill in the correct value.");
49+
vec.clear();
50+
ASSERT(vec.empty(), "`vec` is empty now.");
51+
ASSERT(vec.size() == ?, "Fill in the correct value.");
52+
ASSERT(vec.capacity() == ?, "Fill in the correct value.");
53+
}
54+
}
55+
{
56+
std::vector<char> vec(?, ?); // TODO: 调用正确的构造函数
57+
ASSERT(vec[0] == 'z', "Make this assertion pass.");
58+
ASSERT(vec[47] == 'z', "Make this assertion pass.");
59+
ASSERT(vec.size() == 48, "Make this assertion pass.");
60+
ASSERT(sizeof(vec) == ?, "Fill in the correct value.");
61+
{
62+
auto capacity = vec.capacity();
63+
vec.resize(16);
64+
ASSERT(vec.size() == ?, "Fill in the correct value.");
65+
ASSERT(vec.capacity() == ?, "Fill in the correct identifier.");
66+
}
67+
{
68+
vec.reserve(256);
69+
ASSERT(vec.size() == ?, "Fill in the correct value.");
70+
ASSERT(vec.capacity() == ?, "Fill in the correct value.");
71+
}
72+
{
73+
vec.push_back('a');
74+
vec.push_back('b');
75+
vec.push_back('c');
76+
vec.push_back('d');
77+
ASSERT(vec.size() == ?, "Fill in the correct value.");
78+
ASSERT(vec.capacity() == ?, "Fill in the correct value.");
79+
ASSERT(vec[15] == ?, "Fill in the correct value.");
80+
ASSERT(vec[?] == 'a', "Fill in the correct value.");
81+
ASSERT(vec[?] == 'b', "Fill in the correct value.");
82+
ASSERT(vec[?] == 'c', "Fill in the correct value.");
83+
ASSERT(vec[?] == 'd', "Fill in the correct value.");
84+
}
85+
}
86+
87+
return 0;
88+
}

exercises/24_std_vector_bool/main.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include "../exercise.h"
2+
#include <vector>
3+
4+
// READ: std::vector <https://zh.cppreference.com/w/cpp/container/vector_bool>
5+
// READ: 模板特化 <https://zh.cppreference.com/w/cpp/language/template_specialization>
6+
7+
// TODO: 将下列 `?` 替换为正确的代码
8+
int main(int argc, char **argv) {
9+
std::vector<bool> vec(?, ?);// TODO: 正确调用构造函数
10+
ASSERT(vec[0], "Make this assertion pass.");
11+
ASSERT(vec[99], "Make this assertion pass.");
12+
ASSERT(vec.size() == 100, "Make this assertion pass.");
13+
ASSERT(sizeof(vec) == ?, "Fill in the correct value.");
14+
{
15+
vec[20] = false;
16+
ASSERT(?vec[20], "Fill in `vec[20]` or `!vec[20]`.");
17+
}
18+
{
19+
vec.push_back(false);
20+
ASSERT(vec.size() == ?, "Fill in the correct value.");
21+
ASSERT(?vec[100], "Fill in `vec[100]` or `!vec[100]`.");
22+
}
23+
{
24+
auto ref = vec[30];
25+
ASSERT(?ref, "Fill in `ref` or `!ref`");
26+
ref = false;
27+
ASSERT(?ref, "Fill in `ref` or `!ref`");
28+
ASSERT(?vec[30], "Fill in `vec[30]` or `!vec[30]`.");
29+
}
30+
return 0;
31+
}

exercises/25_strides/main.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include "../exercise.h"
2+
#include <vector>
3+
4+
// 张量即多维数组。连续存储张量即逻辑结构与存储结构一致的张量。
5+
// 通常来说,形状为 [d0, d1, ..., dn] 的张量,第 n 维是 dn 个连续的元素,第 n-1 维是 dn-1 个连续的 dn 个元素,以此类推。
6+
// 张量的步长或跨度指的是张量每个维度上坐标 +1 时,数据指针跨过的范围。
7+
// 因此,一个连续张量,其第 n 维的步长为 1,第 n-1 维的步长为 dn,第 n-2 维的步长为 dn*dn-1,以此类推。
8+
// 例如,一个 2x3x4 张量,其步长为 [12, 4, 1]。
9+
10+
// READ: 类型别名 <https://zh.cppreference.com/w/cpp/language/type_alias>
11+
using udim = unsigned int;
12+
13+
/// @brief 计算连续存储张量的步长
14+
/// @param shape 张量的形状
15+
/// @return 张量每维度的访问步长
16+
std::vector<udim> strides(std::vector<udim> const &shape) {
17+
std::vector<udim> strides(shape.size());
18+
// TODO: 完成函数体,根据张量形状计算张量连续存储时的步长。
19+
// READ: 逆向迭代器 std::vector::rbegin <https://zh.cppreference.com/w/cpp/container/vector/rbegin>
20+
// 使用逆向迭代器可能可以简化代码
21+
return strides;
22+
}
23+
24+
// ---- 不要修改以下代码 ----
25+
int main(int argc, char **argv) {
26+
ASSERT((strides({2, 3, 4}) == std::vector<udim>{12, 4, 1}), "Make this assertion pass.");
27+
ASSERT((strides({3, 4, 5}) == std::vector<udim>{20, 5, 1}), "Make this assertion pass.");
28+
ASSERT((strides({1, 3, 224, 224}) == std::vector<udim>{150528, 50176, 224, 1}), "Make this assertion pass.");
29+
ASSERT((strides({7, 1, 1, 1, 5}) == std::vector<udim>{5, 5, 5, 5, 1}), "Make this assertion pass.");
30+
return 0;
31+
}

exercises/26_std_string/main.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#include "../exercise.h"
2+
#include <string>
3+
4+
int main(int argc, char **argv) {
5+
ASSERT(false, "todo!");
6+
return 0;
7+
}

exercises/27_std_map/main.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#include "../exercise.h"
2+
#include <map>
3+
#include <unordered_map>
4+
5+
int main(int argc, char **argv) {
6+
ASSERT(false, "todo!");
7+
return 0;
8+
}

exercises/28_std_transform/main.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#include "../exercise.h"
2+
#include <algorithm>
3+
4+
int main(int argc, char **argv) {
5+
ASSERT(false, "todo!");
6+
return 0;
7+
}

exercises/29_std_accumulate/main.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#include "../exercise.h"
2+
#include <numeric>
3+
4+
int main(int argc, char **argv) {
5+
ASSERT(false, "todo!");
6+
return 0;
7+
}

exercises/xmake.lua

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,25 @@ target("exercise21")
7373
target("exercise22")
7474
add_files("22_std_array/main.cpp")
7575

76-
-- TODO: vector; vector<bool>; deque; map; forward_list; string; transform; accumulate; fs; thread; mutex;
76+
target("exercise23")
77+
add_files("23_std_vector/main.cpp")
78+
79+
target("exercise24")
80+
add_files("24_std_vector_bool/main.cpp")
81+
82+
target("exercise25")
83+
add_files("25_strides/main.cpp")
84+
85+
target("exercise26")
86+
add_files("26_std_string/main.cpp")
87+
88+
target("exercise27")
89+
add_files("27_std_map/main.cpp")
90+
91+
target("exercise28")
92+
add_files("28_std_transform/main.cpp")
93+
94+
target("exercise29")
95+
add_files("29_std_accumulate/main.cpp")
96+
97+
-- TODO: deque; forward_list; fs; thread; mutex;

learn/summary.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#include <thread>
99
#include <vector>
1010

11-
constexpr auto MAX_EXERCISE = 22;
11+
constexpr auto MAX_EXERCISE = 29;
1212

1313
int main(int argc, char **argv) {
1414
if (argc == 1) {

0 commit comments

Comments
 (0)