From bcafdc11ae39c76aaa4d96357e55d6d64d0c0f0e Mon Sep 17 00:00:00 2001 From: wupi Date: Fri, 29 Nov 2024 21:56:24 +0800 Subject: [PATCH] done the hw3 --- main.cpp | 93 +++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 62 insertions(+), 31 deletions(-) diff --git a/main.cpp b/main.cpp index d76cce7..e1ddf5f 100644 --- a/main.cpp +++ b/main.cpp @@ -1,55 +1,86 @@ +#include #include -#include +#include #include +#include // 请修复这个函数的定义:10 分 +template std::ostream &operator<<(std::ostream &os, std::vector const &a) { - os << "{"; - for (size_t i = 0; i < a.size(); i++) { - os << a[i]; - if (i != a.size() - 1) - os << ", "; - } - os << "}"; - return os; + os << "{"; + for (size_t i = 0; i < a.size(); i++) { + os << a[i]; + if (i != a.size() - 1) + os << ", "; + } + os << "}"; + return os; } // 请修复这个函数的定义:10 分 template -std::vector operator+(std::vector const &a, std::vector const &b) { - // 请实现列表的逐元素加法!10 分 - // 例如 {1, 2} + {3, 4} = {4, 6} +auto operator+(std::vector const &a, std::vector const &b) { + using T0 = decltype(T1{} + T2{}); + auto lens = std::min(a.size(), b.size()); + std::vector res(lens); + if (lens == a.size()) { + std::transform(a.begin(), a.end(), b.begin(), res.begin(), std::plus<>()); + } else { + std::transform(b.begin(), b.end(), a.begin(), res.begin(), std::plus<>()); + } + return res; + // 请实现列表的逐元素加法!10 分 + // 例如 {1, 2} + {3, 4} = {4, 6} } -template -std::variant operator+(std::variant const &a, std::variant const &b) { - // 请实现自动匹配容器中具体类型的加法!10 分 +template +std::variant operator+(std::variant const &a, const U &b) { + using tb = std::decay_t; + std::variant res; + if constexpr (std::is_same_v || std::is_same_v) { + std::visit([&](const auto &x) { res = x + b; }, a); + } else if constexpr (std::is_same_v, tb>) { + + std::visit([&](const auto &x, const auto &y) { res = x + y; }, a, b); + } + return res; } +// template +// std::variant operator+(std::variant const &a, +// std::variant const &b) { + +// std::variant res{}; +// std::visit([&](const auto &a, const auto &v) { res = a + b; }, a, b); +// return res; +// // 请实现自动匹配容器中具体类型的加法!10 分 +// } template std::ostream &operator<<(std::ostream &os, std::variant const &a) { - // 请实现自动匹配容器中具体类型的打印!10 分 + std::visit([&](const auto &a) { os << a; }, a); + return os; + // 请实现自动匹配容器中具体类型的打印!10 分 } int main() { - std::vector a = {1, 4, 2, 8, 5, 7}; - std::cout << a << std::endl; - std::vector b = {3.14, 2.718, 0.618}; - std::cout << b << std::endl; - auto c = a + b; + std::vector a = {1, 4, 2, 8, 5, 7}; + std::cout << a << std::endl; + std::vector b = {3.14, 2.718, 0.618}; + std::cout << b << std::endl; + auto c = a + b; - // 应该输出 1 - std::cout << std::is_same_v> << std::endl; + // 应该输出 1 + std::cout << std::is_same_v> << std::endl; - // 应该输出 {4.14, 6.718, 2.618} - std::cout << c << std::endl; + // 应该输出 {4.14, 6.718, 2.618} + std::cout << c << std::endl; - std::variant, std::vector> d = c; - std::variant, std::vector> e = a; - d = d + c + e; + std::variant, std::vector> d = c; + std::variant, std::vector> e = a; + d = d + c + e; - // 应该输出 {9.28, 17.436, 7.236} - std::cout << d << std::endl; + // 应该输出 {9.28, 17.436, 7.236} + std::cout << d << std::endl; - return 0; + return 0; }