Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 16.10.2020
Сообщений: 117
1

Шаблон для массивов

09.02.2021, 02:19. Показов 596. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня есть 2 перегрузки разных массивов, как сделать так что бы они подходили в 1 и тот же шаблон, вот примерный пример.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
template<typename T1>
T1 maxShablon(T1 arr, int n, char question){
    if(question == '1'){
        int max = 0;
        for (int i = 0; i < n ; ++i) {
            if(arr[i] > max){
                max = arr[i];
            }
        }
        cout<<"Our max: "<<max<<endl;
    }if(question == '2'){
        int max = 0;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                for (int k = 0; k < n; ++k) {
                    if(arr[i][j][k] > max){
                        max = arr[i][j][k];
                    }
                }
            }
        }
        cout<<" Our max: "<<max;
 
    }else{
        return 0;
    }
    return max;


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Перегрузка 2.3
void max3(int *arr, const int n){
    int max = arr[0];
    for (int i = 0; i < n ; ++i) {
        if(arr[i] > max){
            max = arr[i];
        }
    }
    cout<<"Our max: "<<max;
}
 
void max3(char *arr, const int n){
    char max = arr[0];
    for (int i = 0; i < n ; ++i) {
        if(arr[i] > max){
            max = arr[i];
        }
    }
    cout<<"Our max: "<<max;
}
 
void max3(double *arr, const int n){
    double max = arr[0];
    for (int i = 0; i < n ; ++i) {
        if(arr[i] > max){
            max = arr[i];
        }
    }
    cout<<"Our max: "<<max;
}
// Конец  перегрузки 2.3

Вторая перегрузка


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void max(int ***arr, const int n){
    int max = arr[0][0][0];
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j <n ; ++j) {
            for (int k = 0; k <n ; ++k) {
                if(arr[i][j][k]>max){
                    max = arr[i][j][k];
                }
            }
        }
    }
 
    cout<<"Our max is:"<<max;
 
}
 
 
void max(char ***arr, const int n){
    char max = arr[0][0][0];
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j <n ; ++j) {
            for (int k = 0; k <n ; ++k) {
                if(arr[i][j][k]>max){
                    max = arr[i][j][k];
                }
            }
        }
    }
 
    cout<<"Our max is:"<<max<<endl;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2021, 02:19
Ответы с готовыми решениями:

Шаблон класса для преобразования массивов из типа 1 к типу 2 (char -> int)
Шаблон класса для преобразования массивов из типа 1 к типу 2 (char -&gt; int). Нашел код на просторах...

Шаблон класса для преобразования массивов из типа 1 к типу 2 (char -> int)
Здравствуйте, дана задача: Шаблон класса для преобразования массивов из типа 1 к типу 2 (char -&gt;...

Написать шаблон функции для сортировки массивов действительных и целых чисел
Заданы элементы массива. Написать шаблон функции для сортировки массивов действительных и целых...

Как разработать шаблон функции для пересечения 2-х массивов из элементов типа Т?
Как разработать шаблон функции для пересечения 2-х массивов из элементов типа Т???

7
2837 / 2339 / 708
Регистрация: 29.06.2020
Сообщений: 8,655
09.02.2021, 02:34 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
template<typename T>
T maxShablon(T * arr, size_t n)
{
    T max = arr[0];
    for (size_t i = 0; i < n ; ++i) {
        if(arr[i] > max){
            max = arr[i];
        }
    }
   return max;
}
template<typename T>
T maxShablon(T *** arr, size_t n)
{
        T max =  arr[0][0][0];
        for (size_t i = 0; i < n; ++i) {
            for (size_t j = 0; j < n; ++j) {
                for (size_t k = 0; k < n; ++k) {
                    if(arr[i][j][k] > max){
                        max = arr[i][j][k];
                    }
                }
            }
        }
   return max;
}
0
0 / 0 / 0
Регистрация: 16.10.2020
Сообщений: 117
09.02.2021, 02:39  [ТС] 3
Препод сказал, что все должно быть в 1 шаблоне, я ему так-же сдавал, но нельзя.
0
2837 / 2339 / 708
Регистрация: 29.06.2020
Сообщений: 8,655
09.02.2021, 02:40 4
шаблоны только начал изучать, может что и не так.
0
0 / 0 / 0
Регистрация: 16.10.2020
Сообщений: 117
09.02.2021, 03:19  [ТС] 5
Не, твои шаблоны верны, просто нужно сделать это другим способом и я вот не понимаю как.
0
2837 / 2339 / 708
Регистрация: 29.06.2020
Сообщений: 8,655
09.02.2021, 05:17 6
Добавлено через 6 минут
накостылял вот ...
принимает только указатель первого (указатель) уровня и третьего (указатель на указатель на указатель)

дрянное задание...

еще и выглядит так страшно , рано браться мне за такое
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
//#include <type_traits>
 
using namespace std;
template <typename T>
struct remove_all_ref_ptr { typedef T type; };
 
template <typename T>
struct remove_all_ref_ptr<T *> : public remove_all_ref_ptr<T> { };
 
template <typename T>
struct remove_all_ref_ptr<T * const> : public remove_all_ref_ptr<T> { };
 
template <typename T>
struct remove_all_ref_ptr<T * volatile> : public remove_all_ref_ptr<T> { };
 
template <typename T>
struct remove_all_ref_ptr<T * const volatile> : public remove_all_ref_ptr<T> { };
 
template <typename T>
struct remove_all_ref_ptr<T &> : public remove_all_ref_ptr<T> { };
 
template <typename T>
struct remove_all_ref_ptr<T &&> : public remove_all_ref_ptr<T> { };
 
template <typename T>
 struct base_type : public ::std::remove_cv<typename remove_all_ref_ptr<T>::type> { };
 
template<class T> struct dependent_false : std::false_type {};
 
template<typename T>
typename base_type<T>::type maxShablon(T arr, size_t n)
{
     static_assert(is_pointer_v<T>, "Is not a pointer");
 
    if constexpr (!(std::is_pointer_v<remove_pointer_t<T>>) )
        {
             typename base_type<T>::type max = arr[0];
             for (size_t i = 0; i < n ; ++i) {
                  if(arr[i] > max){
                        max = arr[i];
                  }
             }
            return max;
        }
    else
    if constexpr ( (std::is_pointer_v<remove_pointer_t<remove_pointer_t<T>>>) &&
                      !(std::is_pointer_v<remove_pointer_t<remove_pointer_t<remove_pointer_t<T>>>>) )
        {
        typename base_type<T>::type max =  arr[0][0][0];
         for (size_t i = 0; i < n; ++i) {
             for (size_t j = 0; j < n; ++j) {
                 for (size_t k = 0; k < n; ++k) {
                     if(arr[i][j][k] > max){
                         max = arr[i][j][k];
                     }
                 }
             }
         }
         return max;
        }
    else
        static_assert(dependent_false<T>::value, "Type Error");
 
}
 
 
int main()
{
    cout<<boolalpha;
    short s;
    int * ptr1 = new int [3];
    ptr1[0]=1; ptr1[1]=0; ptr1[2]=3;
    double ** ptr2;
    char *** ptr3=new char **[1];
    ptr3[0] = new char*[1];
    ptr3[0][0] = new char[1];
    ptr3[0][0][0] = '!';
    //maxShablon(s,1); //error
    //maxShablon(ptr2,1); // error
    cout<<maxShablon(ptr1,3)<<endl;
    cout<<maxShablon(ptr3,1)<<endl;
}
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
09.02.2021, 10:13 7
----

Добавлено через 23 минуты
Цитата Сообщение от relanix Посмотреть сообщение
Препод сказал, что все должно быть в 1 шаблоне, я ему так-же сдавал, но нельзя.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
template<typename T, typename TSize, typename... TSizes>
auto max_val(const T &arr, TSize n, TSizes... nn)
{
    if constexpr(sizeof...(nn) == 0)
    {
        auto max = arr[0];
        for (size_t i = 1; i < n; ++i)
            if (max < arr[i])
                max = arr[i];
 
        return max;
    }
    else
    {
        auto max = max_val(arr[0], nn...);
        for (size_t i = 1; i < n; ++i)
        {
            auto x = max_val(arr[i], nn...);
            if (max < x)
                max = std::move(x);
        }
        return max;
    }
}
Добавлено через 27 секунд
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
int arr[10][10][10] =
{
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9},
};
//int ***arr;
int max = max_val(arr, 10, 10, 10);
std::cout << max << std::endl;
}
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
09.02.2021, 14:37 8
relanix, статические массивы в памяти расположены последовательно, поэтому с ними можно работать как с одномерными:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
using namespace std;
 
template<typename T>
T Max (T *x, int n)
{    
    T max = x[0];
    for (int i = 1; i < n; i++)    
        if(x[i] > max) max=x[i];            
            
    return max;        
}
 
int main()
{
    const int n=5;    
 
    int a1[n]={1,4,5,9,3};
    
    char a2[n]={'h','g','a','s','u'};
    
    double a3[n]={2.3, 4.5, 9.7, 1.2, 3.4};
                   
    int c1[n][n][n] = 
    { {{2, 2, 3, 4, 7}, {2, 4, 6, 8, 1}, {3, 6, 9, 2, 2}, {2, 4, 6, 8, 1}, {3, 6, 9, 2, 2}},
      {{1, 2, 3, 4, 8}, {2, 4, 1, 8, 2}, {3, 6, 9, 2, 3}, {2, 4, 1, 8, 2}, {3, 6, 9, 2, 3}},
      {{1, 2, 3, 4, 7}, {2, 4, 6, 8, 7}, {3, 6, 9, 2, 4}, {2, 4, 1, 8, 2}, {3, 6, 9, 2, 3}},               
      {{1, 2, 3, 4, 8}, {2, 4, 1, 8, 2}, {3, 6, 19, 5, 3}, {2, 4, 1, 8, 2}, {3, 6, 9, 2, 3}},
      {{1, 2, 3, 4, 7}, {2, 4, 6, 8, 7}, {3, 6, 9, 2, 4}, {2, 4, 1, 8, 2}, {3, 6, 9, 2, 3}} };    
      
    cout << "a1 max=" << Max (a1,n) << "\n";
    cout << "a2 max=" << Max (a2,n) << "\n";
    cout << "a3 max=" << Max (a3,n) << "\n";    
    cout << "c1 max=" << Max (&c1[0][0][0],n*n*n) << "\n";
system("pause");
return 0;
}
0
09.02.2021, 14:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.02.2021, 14:37
Помогаю со студенческими работами здесь

Шаблон класса массивов.
Есть шаблон класса: #include &lt;iostream.h&gt; #include &lt;conio.h&gt; const int n = 3; template...

Шаблоны функций, Ошибка: для использования класса шаблон требуется список аргументов шаблон
Есть у меня 3 структуры Трамвай , Троллейбус , Автобус. Для автобуса определены функции (работают)...

Шаблон сумма элементов двух массивов
Здравствуйте, подскажите как Написать щаблон функции sumTwoArray, который возвращает сумму...

Шаблон для вывода одномерных массивов и матриц
Еще одна рутинная процедура, на которую обычно не хочется убивать кучу времени. Посему делюсь...

Шаблон классов одномерных массивов
Написать шаблон классов одномерных массивов. Предусмотреть конструктор копирования и оператор...

Как протестировать шаблон для dle на этом же хостинге, не удаляя старый шаблон
Добрый вечер, вот вопрос у меня возник, хочу колдовать над своим шаблоном, только вот не знаю где. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru