Форум программистов, компьютерный форум CyberForum.ru

Шаблоны функций - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.75
k_a_t_y
 Аватар для k_a_t_y
10 / 10 / 1
Регистрация: 01.02.2011
Сообщений: 99
20.01.2012, 11:01     Шаблоны функций #1
Всех приветствую! народ помогите задали лабораторку, а в с++ я только новичок подскажите как сделать следующее:
Задание 1: создать модуль библиотеки шаблонов функций по обработке одномерных массивов и продемонстрировать работу библиотеки для типов int, float и char. Все необходимые данные для функций должны передаваться им в качестве параметров. Использование глобальных пе¬ременных в функциях не допускается. Основные алгоритмы, которые должны быть реализованы в библиотеке:
- заполнение случайными значениями;
- файловый ввод/вывод;
- вставка и удаление k-ого элемента в массив;
- сортировка массива;
- поиск максимального и минимального элемента;
- поиск k-ого элемента (положительного, отрицательного, нулевого и др.) с применением предикатов;
- подсчет количества элементов с указанной характеристикой (положительные, отрицательные, нулевые, кратные m) с применением предикатов;
- специализированные шаблоны для обработки типов char*(строка символов).
Примечание: для создания модуля использовать Header File, т.к. шаблоны описывают в заголовочных файлах.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2012, 11:01     Шаблоны функций
Посмотрите здесь:

C++ Шаблоны функций
C++ Шаблоны функций
C++ Шаблоны функций
C++ Шаблоны функций
C++ Шаблоны функций c++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ExcellencE
20 / 20 / 2
Регистрация: 22.08.2011
Сообщений: 79
20.01.2012, 13:17     Шаблоны функций #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
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
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
 
bool predicat(int z)
{
    if(z<4) return true;
    else return false;
}
 
template<typename T>
int deamCount(T arr[], int size, bool (predicat)(T))
{
    int count = 0;
    for(int i = 0;i<size;i++)
        if(predicat(arr[i]))
            count++;
    return count;
}
 
 
template<typename T>
T Max(T arr[], int size)
{
    T Max = arr[0];
    for(int i =0; i< size;i++)
        if(arr[i]>Max)
            Max = arr[i];
   return Max;
}
 
template<typename T>
T Min (T arr[], int size)
{
    T Max = arr[0];
    for(int i =0; i< size;i++)
        if(arr[i]<Max)
            Max = arr[i];
   return Max;
}
 
template<typename T>
void Sort(T arr[], int size)
{
    for(int i =0; i<size;i++)
        for(int j =0; j<size-i-1;j++)
            if(arr[j]>arr[j+1])
            {
                T tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
}
 
int main (void)
{
    int A[5] = {1,3,2,6,4};
    for(int i=0;i<5;i++)
        printf( " %d", A[i]);
    printf("\n Maximum: %d\n", Max(A,5));
    Sort(A,5);
    for(int i=0;i<5;i++)
        printf( " %d", A[i]);
        printf("\n count: %d\n", deamCount(A,5, predicat));
    scanf("\n%d",&A[1]);
}
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
20.01.2012, 13:43     Шаблоны функций #3
Цитата Сообщение от k_a_t_y Посмотреть сообщение
- подсчет количества элементов с указанной характеристикой (положительные, отрицательные, нулевые, кратные m) с применением предикатов;
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
#include <iostream>
 
template <class T, class Predicate> size_t count_if(T first, T last, Predicate pred)
{
   size_t count;
   for ( count = 0 ; first != last ; ++first )
      if ( pred (*first) )
         ++count;
   return count;
}
 
bool odd(int val) { return val % 2; }  
 
template <typename T> void print (T *first, T *last)
{
   std::cout << std::endl;
   for ( ; first != last ; ++first )
      std::cout << *first << " ";
   std::cout << std::endl;
}             
 
int main()
{
   int arr[] = { 1, 2 ,3 ,4 , 5};
   const size_t size = sizeof(arr) / sizeof(arr[0]);
   
   print(arr, arr + size);
   std::cout << "Coutn odd = "  << count_if(arr, arr + size, odd) << std::endl
             << "Count Even = " << count_if(arr, arr + size, [](int val) { return !(val % 2); }) << std::endl;
   return 0;
}
http://liveworkspace.org/code/bccea8...f3f68085007141
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
20.01.2012, 15:16     Шаблоны функций #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Что-то подобное. Единственное - не понял смысла в специализации шаблонов для char, поэтому не стал делать (да и лень). В остальном всё по заданию плюс ещё немного отсебятинки:
arrays.hpp
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
#ifndef ARRAYS_HPP
#define ARRAYS_HPP
 
#include <iostream>
#include <fstream>
#include <cstdlib>
 
//-----------------------------------------------------------------------------
 
template<typename T>
void array_random_fill(T *array, size_t size, const T& lower_bound, const T& upper_bound);
 
template<typename T>
void array_input(T *array, size_t size, std::istream& input = std::cin);
template<typename T>
void array_output(const T *array, size_t size, std::ostream& output = std::cout, const char *separator = " ");
template<typename T>
void array_input_from_file(T *array, size_t size, const char *filename);
template<typename T>
void array_output_to_file(const T *array, size_t size, const char *filename, const char *separator = " ");
 
template<typename T>
void array_insert(T *array, size_t size, const T& elem, size_t pos);
template<typename T>
void array_erase(T *array, size_t size, size_t pos);
 
template<typename T>
void array_sort(T *array, size_t size);
 
template<typename T>
T array_min_element(const T *array, size_t size);
template<typename T>
T array_max_element(const T *array, size_t size);
 
template<typename T>
const T *array_find(const T *array, size_t size, const T& value);
template<typename T>
const T *array_find_if(const T *array, size_t size, bool (*predicate)(T));
template<typename T>
const T *array_find_nth_if(const T *array, size_t size, size_t n, bool (*predicate)(T));
 
template<typename T>
size_t array_count(const T *array, size_t size, const T& value);
template<typename T>
size_t array_count_if(const T *array, size_t size, bool (*predicate)(const T&));
 
//-----------------------------------------------------------------------------
 
// Заполнение массива случайными числами, лежащими в границах
// [upper_bound; lowrer_bound)
template<typename T>
void array_random_fill(T *array, size_t size, const T& lower_bound, const T& upper_bound)
{
    // Сгенерировать число для каждого элемента массива
    for (size_t i = 0; i < size; ++i)
        array[i] = T(double(lower_bound) + (double(upper_bound) - double(lower_bound)) * double(rand()) / RAND_MAX);
}
 
//-----------------------------------------------------------------------------
 
// Ввод массива из потока input
template<typename T>
void array_input(T *array, size_t size, std::istream& input)
{
    // Очередной считанный элемент
    T elem;
    
    // Ввод производится до тех пор, пока массив не заполнен или пока есть данные
    // в потоке
    for (size_t i = 0; (i < size) && (input >> elem); ++i)
        array[i] = elem;
}
 
// Вывод массива в поток output
template<typename T>
void array_output(const T *array, size_t size, std::ostream& output, const char *separator)
{
    // Выводи каждый элемент в поток
    for (size_t i = 0; i < size; ++i)
        output << array[i] << separator;
}
 
// Ввод массива из файла filename
template<typename T>
void array_input_from_file(T *array, size_t size, const char *filename)
{
    std::ifstream fin(filename);
    
    array_input(array, size, fin);
}
 
// Вывод массива в файл filename
template<typename T>
void array_output_to_file(const T *array, size_t size, const char *filename, const char *separator)
{
    std::ofstream fout(filename);
    
    array_output(array, size, fout, separator);
}
 
//-----------------------------------------------------------------------------
 
// Вставка элемента elem в позицию pos
// ВНИМАНИЕ! Массив должен быть способен вместить как минимум size + 1 элемент
template<typename T>
void array_insert(T *array, size_t size, const T& elem, size_t pos)
{
    if (pos > size)
        pos = size;
    
    // Сдвигаем все элементы с конца массиво до позиции pos врпаво на 1 элемент
    for (int i = int(size); i > int(pos); --i)
        array[i] = array[i - 1];
    
    // В позицию pos записываем элемент elem
    array[pos] = elem;
}
 
// Удаление элемента из массива
template<typename T>
void array_erase(T *array, size_t size, size_t pos)
{
    // Сдвигаем все элементы, начиная с позиции pos и до конца массива на 1
    // элемент влево
    for (size_t i = pos; i < size - 1; ++i)
        array[i] = array[i + 1];
}
 
//-----------------------------------------------------------------------------
 
// Пузырьковая сортировка массива
template<typename T>
void array_sort(T *array, size_t size)
{
    for (size_t i = 0; i < size - 1; ++i)
        for (size_t j = 0; j < size - i - 1; ++j)
            if (array[j] > array[j + 1])
                std::swap(array[j], array[j + 1]);
            
}
 
//-----------------------------------------------------------------------------
 
// Поиск минимального элемента
template<typename T>
T array_min_element(const T *array, size_t size)
{
    T min = array[0];
    
    for (size_t i = 1; i < size; ++i)
        if (min > array[i])
            min = array[i];
    
    return min;
}
 
// Поиск максимального элемента
template<typename T>
T array_max_element(const T *array, size_t size)
{
    T max = array[0];
    
    for (size_t i = 1; i < size; ++i)
        if (max < array[i])
            max = array[i];
    
    return max;
}
 
//-----------------------------------------------------------------------------
 
// Линейный поиск заданного элемента в массиве. Результат - указатель на искомый
// элемент; если элемент не найден - нулевой указатель.
template<typename T>
const T *array_find(const T *array, size_t size, const T& value)
{
    for (const T *p = array; p != array + size; ++p)
        if (*p == value)
            return p;
    
    return 0;
}
 
// Поиск первого элемента, удовлетворяющего условию predicate. Результат -
// указатель на искомый элемент; если элемент не найден - нулевой указатель.
template<typename T>
const T *array_find_if(const T *array, size_t size, bool (*predicate)(T))
{
    for (const T *p = array; p != array + size; ++p)
        if ((*predicate)(*p))
            return p;
    
    return 0;
}
 
// Поиск n-того элемента, удовлетворяющего условию predicate. Результат -
// указатель на искомый элемент; если элемент не найден - нулевой указатель.
template<typename T>
const T *array_find_nth_if(const T *array, size_t size, size_t n, bool (*predicate)(T))
{
    if (n == 0)
        return 0;
    
    const T *res = array - 1;
    
    while (n-- != 0)
        if ((res = array_find_if(res + 1, size - (res + 1 - array), predicate)) == 0)
            return 0;
    
    return res;
}
 
//-----------------------------------------------------------------------------
 
// Подсчёт вхождений элемента value в массив
template<typename T>
size_t array_count(const T *array, size_t size, const T& value)
{
    size_t count = 0;
    
    for (size_t i = 0; i < size; ++i)
        if (array[i] == value)
            ++count;
    
    return count;
}
 
// Подсчёт вхождений элементов, удовлетворяющих условию predicate, в массив
template<typename T>
size_t array_count_if(const T *array, size_t size, bool (*predicate)(T))
{
    size_t count = 0;
    
    for (size_t i = 0; i < size; ++i)
        if ((*predicate)(array[i]))
            ++count;
    
    return count;
}
 
//-----------------------------------------------------------------------------
 
#endif
main.cpp
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
#include <iostream>
#include <algorithm>
#include <iterator>
#include <cstdlib>
#include <ctime>
 
#include "arrays.hpp"
 
bool pred(char ch)
{
    return ch > 'b';
}
 
int main()
{
    srand(unsigned(time(0)));
    
    const size_t size = 10;
    
    int arr1[size];
    array_random_fill(arr1, size, 0, 100);
    std::cout << "arr1: ";
    array_output(arr1, size);
    std::cout << std::endl;
    array_input(arr1, size);
    array_output_to_file(arr1, size, "test1.txt");
    
    int arr2[size] = {0};
    array_input_from_file(arr2, size, "test2.txt");
    std::cout << "arr2: ";
    array_output(arr2, size);
    std::cout << std::endl;
    
    int arr3[size + 1] = {0};
    array_random_fill(arr3, size, 0, 100);
    std::cout << "arr3: ";
    array_output(arr3, size);
    std::cout << std::endl;
    array_insert(arr3, size, 200, 0);
    std::cout << "arr3 after inserting 200 in position 0: ";
    array_output(arr3, size + 1);
    std::cout << std::endl;
    array_erase(arr3, size + 1, 0);
    array_insert(arr3, size, 200, 10);
    std::cout << "arr3 after inserting 200 in position 10: ";
    array_output(arr3, size + 1);
    std::cout << std::endl;
    array_erase(arr3, size + 1, 10);
    array_insert(arr3, size, 200, 5);
    std::cout << "arr3 after inserting 200 in position 5: ";
    array_output(arr3, size + 1);
    std::cout << std::endl;
    array_erase(arr3, size + 1, 5);
    
    double arr4[size];
    array_random_fill(arr4, size, 0.0, 20.0);
    std::cout << "arr4: ";
    array_output(arr4, size);
    std::cout << std::endl;
    std::cout << "min element in arr4: " << array_min_element(arr4, size) << std::endl;
    std::cout << "max element in arr4: " << array_max_element(arr4, size) << std::endl;
    array_sort(arr4, size);
    std::cout << "arr4 after sorting: ";
    array_output(arr4, size);
    std::cout << std::endl;
    
    char arr5[size] = "abcabcacc";
    std::cout << "arr5: ";
    array_output(arr5, size);
    std::cout << std::endl;
    std::cout << "pos of first symbol \'c\' in arr5: " << array_find(arr5, size, 'c') - arr5 << std::endl;
    std::cout << "pos of first symbol \'d\' in arr5: " << array_find(arr5, size, 'd') - arr5 << std::endl;
    std::cout << "pos of first symbol which more \'b\' in arr5: " << array_find_if(arr5, size, pred) - arr5 << std::endl;
    std::cout << "pos of second symbol which more \'b\' in arr5: " << array_find_nth_if(arr5, size, 2, pred) - arr5 << std::endl;
    std::cout << "pos of third symbol which more \'b\' in arr5: " << array_find_nth_if(arr5, size, 3, pred) - arr5 << std::endl;
    std::cout << "pos of fourth symbol which more \'b\' in arr5: " << array_find_nth_if(arr5, size, 4, pred) - arr5 << std::endl;
    std::cout << "pos of fifth symbol which more \'b\' in arr5: " << array_find_nth_if(arr5, size, 5, pred) - arr5 << std::endl;
    std::cout << "count of symbols \'a\' in arr5: " << array_count(arr5, size, 'a') << std::endl;
    std::cout << "count of symbols which more \'b\' in arr5: " << array_count_if(arr5, size, pred) << std::endl;
    
    return 0;
}
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
20.01.2012, 15:27     Шаблоны функций #5
silent_1991,

Не по теме:

с Лямбда не хочет работать? http://liveworkspace.org/code/94aedd...770ed2966651f9

Jupiter
20.01.2012, 15:41
  #6

Не по теме:

Цитата Сообщение от go Посмотреть сообщение
с Лямбда не хочет работать?
указатель на функцию не является функциональным объектом коим является лямбда

k_a_t_y
 Аватар для k_a_t_y
10 / 10 / 1
Регистрация: 01.02.2011
Сообщений: 99
20.01.2012, 16:27  [ТС]     Шаблоны функций #7
silent_1991 , Что то не компилируется, выдает ошибки
Вложения
Тип файла: rar laba1.rar (12.3 Кб, 9 просмотров)
dimcoder
20.01.2012, 16:48
  #8

Не по теме:

Цитата Сообщение от k_a_t_y Посмотреть сообщение
выдает ошибки
Connecting to k_a_t_y...
Retrying to connect k_a_t_y...
Access denied, telepaty v otpuske.

silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
20.01.2012, 17:53     Шаблоны функций #9
go, вот так заработает и с лямбдами, и с функторами, и с указателями на функции:
arrays.hpp
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
#ifndef ARRAYS_HPP
#define ARRAYS_HPP
 
#include <iostream>
#include <fstream>
#include <cstdlib>
 
//-----------------------------------------------------------------------------
 
template<typename T>
void array_random_fill(T *array, size_t size, const T& lower_bound, const T& upper_bound);
 
template<typename T>
void array_input(T *array, size_t size, std::istream& input = std::cin);
template<typename T>
void array_output(const T *array, size_t size, std::ostream& output = std::cout, const char *separator = " ");
template<typename T>
void array_input_from_file(T *array, size_t size, const char *filename);
template<typename T>
void array_output_to_file(const T *array, size_t size, const char *filename, const char *separator = " ");
 
template<typename T>
void array_insert(T *array, size_t size, const T& elem, size_t pos);
template<typename T>
void array_erase(T *array, size_t size, size_t pos);
 
template<typename T>
void array_sort(T *array, size_t size);
 
template<typename T>
T array_min_element(const T *array, size_t size);
template<typename T>
T array_max_element(const T *array, size_t size);
 
template<typename T>
const T *array_find(const T *array, size_t size, const T& value);
template<typename T, typename Pred>
const T *array_find_if(const T *array, size_t size, Pred predicate);
template<typename T, typename Pred>
const T *array_find_nth_if(const T *array, size_t size, size_t n, Pred predicate);
 
template<typename T>
size_t array_count(const T *array, size_t size, const T& value);
template<typename T, typename Pred>
size_t array_count_if(const T *array, size_t size, Pred predicate);
 
//-----------------------------------------------------------------------------
 
// Заполнение массива случайными числами, лежащими в границах
// [upper_bound; lowrer_bound)
template<typename T>
void array_random_fill(T *array, size_t size, const T& lower_bound, const T& upper_bound)
{
    // Сгенерировать число для каждого элемента массива
    for (size_t i = 0; i < size; ++i)
        //array[i] = T(Random::generate(double(lower_bound), double(upper_bound)));
        array[i] = T(double(lower_bound) + (double(upper_bound) - double(lower_bound)) * double(rand()) / RAND_MAX);
}
 
//-----------------------------------------------------------------------------
 
// Ввод массива из потока input
template<typename T>
void array_input(T *array, size_t size, std::istream& input)
{
    // Очередной считанный элемент
    T elem;
    
    // Ввод производится до тех пор, пока массив не заполнен или пока есть данные
    // в потоке
    for (size_t i = 0; (i < size) && (input >> elem); ++i)
        array[i] = elem;
}
 
// Вывод массива в поток output
template<typename T>
void array_output(const T *array, size_t size, std::ostream& output, const char *separator)
{
    // Выводи каждый элемент в поток
    for (size_t i = 0; i < size; ++i)
        output << array[i] << separator;
}
 
// Ввод массива из файла filename
template<typename T>
void array_input_from_file(T *array, size_t size, const char *filename)
{
    std::ifstream fin(filename);
    
    array_input(array, size, fin);
}
 
// Вывод массива в файл filename
template<typename T>
void array_output_to_file(const T *array, size_t size, const char *filename, const char *separator)
{
    std::ofstream fout(filename);
    
    array_output(array, size, fout, separator);
}
 
//-----------------------------------------------------------------------------
 
// Вставка элемента elem в позицию pos
// ВНИМАНИЕ! Массив должен быть способен вместить как минимум size + 1 элемент
template<typename T>
void array_insert(T *array, size_t size, const T& elem, size_t pos)
{
    if (pos > size)
        pos = size;
    
    // Сдвигаем все элементы с конца массиво до позиции pos врпаво на 1 элемент
    for (int i = int(size); i > int(pos); --i)
        array[i] = array[i - 1];
    
    // В позицию pos записываем элемент elem
    array[pos] = elem;
}
 
// Удаление элемента из массива
template<typename T>
void array_erase(T *array, size_t size, size_t pos)
{
    // Сдвигаем все элементы, начиная с позиции pos и до конца массива на 1
    // элемент влево
    for (size_t i = pos; i < size - 1; ++i)
        array[i] = array[i + 1];
}
 
//-----------------------------------------------------------------------------
 
// Пузырьковая сортировка массива
template<typename T>
void array_sort(T *array, size_t size)
{
    for (size_t i = 0; i < size - 1; ++i)
        for (size_t j = 0; j < size - i - 1; ++j)
            if (array[j] > array[j + 1])
                std::swap(array[j], array[j + 1]);
            
}
 
//-----------------------------------------------------------------------------
 
// Поиск минимального элемента
template<typename T>
T array_min_element(const T *array, size_t size)
{
    T min = array[0];
    
    for (size_t i = 1; i < size; ++i)
        if (min > array[i])
            min = array[i];
    
    return min;
}
 
// Поиск максимального элемента
template<typename T>
T array_max_element(const T *array, size_t size)
{
    T max = array[0];
    
    for (size_t i = 1; i < size; ++i)
        if (max < array[i])
            max = array[i];
    
    return max;
}
 
//-----------------------------------------------------------------------------
 
// Линейный поиск заданного элемента в массиве. Результат - указатель на искомый
// элемент; если элемент не найден - нулевой указатель.
template<typename T>
const T *array_find(const T *array, size_t size, const T& value)
{
    for (const T *p = array; p != array + size; ++p)
        if (*p == value)
            return p;
    
    return 0;
}
 
// Поиск первого элемента, удовлетворяющего условию predicate. Результат -
// указатель на искомый элемент; если элемент не найден - нулевой указатель.
template<typename T, typename Pred>
const T *array_find_if(const T *array, size_t size, Pred predicate)
{
    for (const T *p = array; p != array + size; ++p)
        if (predicate(*p))
            return p;
    
    return 0;
}
 
// Поиск n-того элемента, удовлетворяющего условию predicate. Результат -
// указатель на искомый элемент; если элемент не найден - нулевой указатель.
template<typename T, typename Pred>
const T *array_find_nth_if(const T *array, size_t size, size_t n, Pred predicate)
{
    if (n == 0)
        return 0;
    
    const T *res = array - 1;
    
    while (n-- != 0)
        if ((res = array_find_if(res + 1, size - (res + 1 - array), predicate)) == 0)
            return 0;
    
    return res;
}
 
//-----------------------------------------------------------------------------
 
// Подсчёт вхождений элемента value в массив
template<typename T>
size_t array_count(const T *array, size_t size, const T& value)
{
    size_t count = 0;
    
    for (size_t i = 0; i < size; ++i)
        if (array[i] == value)
            ++count;
    
    return count;
}
 
// Подсчёт вхождений элементов, удовлетворяющих условию predicate, в массив
template<typename T, typename Pred>
size_t array_count_if(const T *array, size_t size, Pred predicate)
{
    size_t count = 0;
    
    for (size_t i = 0; i < size; ++i)
        if (predicate(array[i]))
            ++count;
    
    return count;
}
 
//-----------------------------------------------------------------------------
 
#endif
main.cpp
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
84
85
86
87
88
89
90
91
#include <iostream>
#include <algorithm>
#include <iterator>
#include <cstdlib>
#include <ctime>
 
#include "arrays.hpp"
 
bool pred(char ch)
{
    return ch > 'b';
}
 
class Predicate : public std::unary_function<char, bool>
{
public:
    virtual bool operator()(char ch) const
    {
        return ch > 'b';
    }
};
 
int main()
{
    srand(unsigned(time(0)));
    
    const size_t size = 10;
    
    int arr1[size];
    array_random_fill(arr1, size, 0, 100);
    std::cout << "arr1: ";
    array_output(arr1, size);
    std::cout << std::endl;
    array_input(arr1, size);
    array_output_to_file(arr1, size, "test1.txt");
    
    int arr2[size] = {0};
    array_input_from_file(arr2, size, "test2.txt");
    std::cout << "arr2: ";
    array_output(arr2, size);
    std::cout << std::endl;
    
    int arr3[size + 1] = {0};
    array_random_fill(arr3, size, 0, 100);
    std::cout << "arr3: ";
    array_output(arr3, size);
    std::cout << std::endl;
    array_insert(arr3, size, 200, 0);
    std::cout << "arr3 after inserting 200 in position 0: ";
    array_output(arr3, size + 1);
    std::cout << std::endl;
    array_erase(arr3, size + 1, 0);
    array_insert(arr3, size, 200, 10);
    std::cout << "arr3 after inserting 200 in position 10: ";
    array_output(arr3, size + 1);
    std::cout << std::endl;
    array_erase(arr3, size + 1, 10);
    array_insert(arr3, size, 200, 5);
    std::cout << "arr3 after inserting 200 in position 5: ";
    array_output(arr3, size + 1);
    std::cout << std::endl;
    array_erase(arr3, size + 1, 5);
    
    double arr4[size];
    array_random_fill(arr4, size, 0.0, 20.0);
    std::cout << "arr4: ";
    array_output(arr4, size);
    std::cout << std::endl;
    std::cout << "min element in arr4: " << array_min_element(arr4, size) << std::endl;
    std::cout << "max element in arr4: " << array_max_element(arr4, size) << std::endl;
    array_sort(arr4, size);
    std::cout << "arr4 after sorting: ";
    array_output(arr4, size);
    std::cout << std::endl;
    
    char arr5[size] = "abcabcacc";
    std::cout << "arr5: ";
    array_output(arr5, size);
    std::cout << std::endl;
    std::cout << "pos of first symbol \'c\' in arr5: " << array_find(arr5, size, 'c') - arr5 << std::endl;
    std::cout << "pos of first symbol \'d\' in arr5: " << array_find(arr5, size, 'd') - arr5 << std::endl;
    std::cout << "pos of first symbol which more \'b\' in arr5: " << array_find_if(arr5, size, [](char ch) -> bool { return ch > 'b'; }) - arr5 << std::endl;
    std::cout << "pos of second symbol which more \'b\' in arr5: " << array_find_nth_if(arr5, size, 2, pred) - arr5 << std::endl;
    std::cout << "pos of third symbol which more \'b\' in arr5: " << array_find_nth_if(arr5, size, 3, Predicate()) - arr5 << std::endl;
    std::cout << "pos of fourth symbol which more \'b\' in arr5: " << array_find_nth_if(arr5, size, 4, pred) - arr5 << std::endl;
    std::cout << "pos of fifth symbol which more \'b\' in arr5: " << array_find_nth_if(arr5, size, 5, Predicate()) - arr5 << std::endl;
    std::cout << "count of symbols \'a\' in arr5: " << array_count(arr5, size, 'a') << std::endl;
    std::cout << "count of symbols which more \'b\' in arr5: " << array_count_if(arr5, size, [](char ch) -> bool { return ch > 'b'; }) << std::endl;
    
    return 0;
}
Добавлено через 1 минуту
k_a_t_y, что-то в коде меняли?
k_a_t_y
 Аватар для k_a_t_y
10 / 10 / 1
Регистрация: 01.02.2011
Сообщений: 99
20.01.2012, 18:07  [ТС]     Шаблоны функций #10
нет ничего
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
20.01.2012, 18:07     Шаблоны функций #11
k_a_t_y, и какие ошибки выдаёт?
k_a_t_y
 Аватар для k_a_t_y
10 / 10 / 1
Регистрация: 01.02.2011
Сообщений: 99
20.01.2012, 18:16  [ТС]     Шаблоны функций #12
у меня что не получается (извините за тупость), но можно вас попросить прикрепить файликом вашу програмку.... плиз
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
20.01.2012, 18:19     Шаблоны функций #13
Пожалуйста.
Вложения
Тип файла: rar Arrays.rar (2.5 Кб, 14 просмотров)
k_a_t_y
 Аватар для k_a_t_y
10 / 10 / 1
Регистрация: 01.02.2011
Сообщений: 99
20.01.2012, 18:27  [ТС]     Шаблоны функций #14
У меня не запускается ваша программа пишет следующие ошибки:
[C++ Error] main.cpp(7): E2209 Unable to open include file 'arrays.hpp'
[C++ Error] main.cpp(25): E2268 Call to undefined function 'time'
[C++ Error] main.cpp(30): E2268 Call to undefined function 'array_random_fill'
[C++ Error] main.cpp(32): E2268 Call to undefined function 'array_output'
[C++ Error] main.cpp(34): E2268 Call to undefined function 'array_input'
[C++ Error] main.cpp(35): E2268 Call to undefined function 'array_output_to_file'
[C++ Error] main.cpp(38): E2268 Call to undefined function 'array_input_from_file'
[C++ Error] main.cpp(48): E2268 Call to undefined function 'array_insert'
[C++ Error] main.cpp(52): E2268 Call to undefined function 'array_erase'
[C++ Error] main.cpp(69): E2268 Call to undefined function 'array_min_element'
[C++ Error] main.cpp(70): E2268 Call to undefined function 'array_max_element'
[C++ Error] main.cpp(71): E2268 Call to undefined function 'array_sort'
[C++ Error] main.cpp(80): E2268 Call to undefined function 'array_find'
[C++ Error] main.cpp(80): E2086 Illegal pointer subtraction
[C++ Error] main.cpp(81): E2086 Illegal pointer subtraction
[C++ Error] main.cpp(82): E2268 Call to undefined function 'array_find_if'
[C++ Error] main.cpp(82): E2188 Expression syntax
[C++ Error] main.cpp(83): E2268 Call to undefined function 'array_find_nth_if'
[C++ Error] main.cpp(83): E2086 Illegal pointer subtraction
[C++ Error] main.cpp(84): E2086 Illegal pointer subtraction
[C++ Error] main.cpp(85): E2086 Illegal pointer subtraction
[C++ Error] main.cpp(86): E2086 Illegal pointer subtraction
[C++ Error] main.cpp(87): E2268 Call to undefined function 'array_count'
[C++ Error] main.cpp(88): E2268 Call to undefined function 'array_count_if'
[C++ Error] main.cpp(88): E2188 Expression syntax
[C++ Error] main.cpp(88): E2228 Too many error or warning messages
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
20.01.2012, 18:28     Шаблоны функций #15
k_a_t_y, компилятор какой?
k_a_t_y
 Аватар для k_a_t_y
10 / 10 / 1
Регистрация: 01.02.2011
Сообщений: 99
20.01.2012, 18:31  [ТС]     Шаблоны функций #16
билдер 6, если вы это имеете ввиду
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
20.01.2012, 18:31     Шаблоны функций #17
k_a_t_y, не знаю я тонкостей билдера. Скорее всего, надо arrays.hpp в проект добавить.
k_a_t_y
 Аватар для k_a_t_y
10 / 10 / 1
Регистрация: 01.02.2011
Сообщений: 99
20.01.2012, 18:36  [ТС]     Шаблоны функций #18
а как arrays.hpp в проект добавить? А у вас какой компилятор?
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
20.01.2012, 18:48     Шаблоны функций #19
Цитата Сообщение от k_a_t_y Посмотреть сообщение
а как arrays.hpp в проект добавить?
По-моему это
Цитата Сообщение от silent_1991 Посмотреть сообщение
не знаю я тонкостей билдера
даёт вполне красноречивый ответ. А именно: понятия не имею.

Цитата Сообщение от k_a_t_y Посмотреть сообщение
А у вас какой компилятор?
Компилятор и IDE - разные вещи. Билдер - IDE (интегрированная среда разработки), и её тонкостей я не знаю. Я использую mingw, мне достаточно в командной строке указать, что компилировать необходимо файл main.cpp.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2012, 19:01     Шаблоны функций
Еще ссылки по теме:

Шаблоны функций в с++ C++
Шаблоны функций C++
C++ Шаблоны функций

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

Или воспользуйтесь поиском по форуму:
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
20.01.2012, 19:01     Шаблоны функций #20
k_a_t_y, Вы этот хедер не добавили в проект

Добавлено через 58 секунд
silent_1991, у меня только на рандом ругался буилдер. Только у меня 10-ый буилдер стоит.
Yandex
Объявления
20.01.2012, 19:01     Шаблоны функций
Ответ Создать тему
Опции темы

Текущее время: 16:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru