35657

Untitled

Sep 9th, 2023
1,005
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.52 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cassert>
  3. #include <optional>
  4. #include <string_view>
  5. #include <utility>
  6. #include <vector>
  7.  
  8. using namespace std;
  9.  
  10. // напишите функцию ComputeStatistics, принимающую 5 параметров:
  11. // два итератора, выходное значение для суммы, суммы квадратов и максимального элемента
  12.  
  13. template <typename InputIt, typename OutSum, typename OutSqSum, typename OutMax>
  14. void ComputeStatistics(InputIt first, InputIt last, OutSum& out_sum, OutSqSum& out_sq_sum, OutMax& out_max) {
  15.  
  16.     using Elem = std::decay_t<decltype(*first)>; // определить тип переданного параметра чтобы создать временную переменную
  17.  
  18.     Elem temp_sum{ *first };
  19.     Elem temp_sq_sum{ *first };
  20.     Elem temp_max{ *first };
  21.  
  22.  
  23.     for (auto it = first + 1; it != last; it++) {
  24.         auto value = *it;
  25.         if constexpr (!is_same_v<OutSum, const nullopt_t>) {
  26.             temp_sum += value;
  27.         }
  28.         if constexpr (!is_same_v<OutSqSum, const nullopt_t>) {
  29.             temp_sq_sum += value * value;
  30.         }
  31.         if constexpr (!is_same_v<OutMax, const nullopt_t>) {
  32.             if (temp_max < value) {
  33.                 temp_max = value;
  34.             }
  35.         }
  36.     }
  37.  
  38.     if constexpr (!is_same_v<OutSum, const nullopt_t>) {
  39.        out_sum = temp_sum;
  40.     }
  41.     if constexpr (!is_same_v<OutSqSum, const nullopt_t>) {
  42.         out_sq_sum = temp_sq_sum;
  43.     }
  44.     if constexpr (!is_same_v<OutMax, const nullopt_t>) {
  45.         out_max = temp_max;
  46.     }
  47. }
  48.  
  49. struct OnlySum {
  50.     int value;
  51. };
  52.  
  53. OnlySum operator+(OnlySum l, OnlySum r) {
  54.     return {l.value + r.value};
  55. }
  56. OnlySum& operator+=(OnlySum& l, OnlySum r) {
  57.     return l = l + r;
  58. }
  59.  
  60. int main() {
  61.     vector input = {1, 2, 3, 4, 5, 6};
  62.     int sq_sum;
  63.     std::optional<int> max;
  64.  
  65.     // Переданы выходные параметры разных типов - std::nullopt_t, int и std::optional<int>
  66.     ComputeStatistics(input.begin(), input.end(), nullopt, sq_sum, max);
  67.  
  68.     assert(sq_sum == 91 && max && *max == 6);
  69.  
  70.     vector<OnlySum> only_sum_vector = {{100}, {-100}, {20}};
  71.     OnlySum sum;
  72.  
  73.     // Поданы значения поддерживающие только суммирование, но запрошена только сумма
  74.     ComputeStatistics(only_sum_vector.begin(), only_sum_vector.end(), sum, nullopt, nullopt);
  75.  
  76.     assert(sum.value == 20);
  77. }
Advertisement
Add Comment
Please, Sign In to add comment