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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Luna17
 Аватар для Luna17
3 / 3 / 1
Регистрация: 09.03.2010
Сообщений: 95
03.05.2010, 23:52     Шаблон функции #1
ПРОГА
Организовать шаблон функции для сортировки массива, предусмотрев, параметр заданный по умолчанию. По умолчанию порядок сортировки от минимального к максимальному элементу. Вызов функции сортировки произвести для целочисленных, вещественных и символьных элементов.

Помогите составить прогу, или покажите где можно подобное посмотреть
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
04.05.2010, 00:13     Шаблон функции #2
шаблон

C++
1
2
3
template<class T>
void sort(T& mas, int t=0){
}
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.05.2010, 01:11     Шаблон функции #3
PointsEqual, не угадал.
Luna17, вот шаблонная функция сортировки пузырьком:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<class T>
void Swap(T& left, T& right) {
  T tmp   = left;
    left  = right;
    right = tmp; 
}
 
template<class T>
void SortExchange(T* arr, int size, int sort_up = 1) {
  for (int i = 1; i < size; ++i)
    for (int j = size - 1; j >= i; --j)
      if (sort_up == 1? arr[j-1] > arr[j] : arr[j - 1] < arr[j])
        Swap(arr[j], arr[j - 1]);
}
Использовать точно также как и обычные функции:
C++
1
2
int arr[] = {1, 4, 2, 8 , 5, 7, 3, 6, 4};
SortExchange(arr, sizeof(arr) / sizeof(arr[0]));
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
04.05.2010, 12:11     Шаблон функции #4
CyBOSSeR, почиму же, мой шаблон тоже работает
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.05.2010, 12:24     Шаблон функции #5
PointsEqual, я себе слабо представляю как. Приведи пример.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
04.05.2010, 12:31     Шаблон функции #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
#include <iostream>
 
using namespace std;
 
template<class T>
void Swap(T& left, T& right) {
  T tmp   = left;
    left  = right;
    right = tmp;
}
 
template<class T>
void sort(T& mas, int t=0){
    int size=sizeof(mas)/sizeof(mas[0]);
    for (int i = 1; i < size; ++i)
    for (int j = size - 1; j >= i; --j)
      if (t == 1 ? mas[j-1] > mas[j] : mas[j - 1] < mas[j])
      Swap(mas[j], mas[j - 1]);
 
}
 
int main()
{
 
    int mas[5]={4,9,2,6,1};
    sort(mas,0);
    for (int i=0; i<5; i++)
    cout<<mas[i];
 
    return 0;
}
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.05.2010, 12:56     Шаблон функции #7
PointsEqual, этот вариант не работает для массивов, память под которые выделена динамически и вообще не является сортировкой массивов, а любого объекта поддерживающего индексацию.
Luna17
 Аватар для Luna17
3 / 3 / 1
Регистрация: 09.03.2010
Сообщений: 95
04.05.2010, 22:04  [ТС]     Шаблон функции #8
CyBOSSeR, пасяб за советы, но я уже сделала сегодня на паре, вот то что получилось, мож кому пригодится (кста оч помогла прошлая прога с которой ты мне помогал)
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
// tgtf.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <conio.h>
#include <iostream>
#include <stdio.h>
 
#include <string.h> 
#include <iomanip>
 
#include <locale.h>
 
using namespace std;
 
template <class Type>
void Sort(Type *x, int n)
{
Type tmp;
for (int i = 1; i < n; ++i)
    for (int j = n - 1; j >= i; --j)
      if ( x[j - 1] > x[j] ) 
      {
        Type tmp = x[j - 1];
            x[j - 1] = x[j];
            x[j] = tmp;
      }
}
int main()
{
 setlocale (LC_ALL, "Russian");
    const int n=10;
 
    char char_x[n] = {'b', 'c', 'z', 'c', 'd', 'r'};
   
 
   printf ("Исходный символьный массив \n");
   for (int i = 0; i < n; ++i)
   cout << char_x[i] << " ";
   cout << endl;
 
   printf ("Cортировка по возрастанию символьного массива \n");
   Sort(char_x, n);
   for (int i = 0; i < n; ++i)
   cout << char_x[i] << " ";
   cout << endl;
 
   int int_x[] = {5, 1, 4, 6, 3, 3, 6, 7, 8, 9, 0};
  
 
   printf ("Исходный целочисленный массив \n");
   for (int i = 0; i < n; ++i)
   cout << int_x[i] << " ";
   cout << endl;
 
   printf ("Сортировка по возрастнию целочисленого массива \n");
   Sort(int_x , n);
   for (int i = 0; i < n; ++i)
   cout << int_x[i] << " ";
   cout << endl;
   
   double double_x[] = {5.8, 1.7, 4.3, 6.3, 5.9, 4.6, 6.1, 5.7, 1.3, 0.3 };
 
   printf ("Исходный вещественный массив \n");
   for (int i = 0; i < n; ++i)
   cout << double_x[i] << " ";
   cout << endl;
 
   printf ("Сортировка по возрастнию вещественный массива \n");
   Sort(double_x , n);
   for (int i = 0; i < n; ++i)
   cout << double_x[i] << " ";
   cout << endl;
 
    _getch();
  return 0;
}
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.05.2010, 23:06     Шаблон функции #9
Luna17, кое что лишнее:
Цитата Сообщение от Luna17 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template <class Type>
void Sort(Type *x, int n)
{
Type tmp; // <-- эту строку можно и нужно убрать
for (int i = 1; i < n; ++i)
    for (int j = n - 1; j >= i; --j)
      if ( x[j - 1] > x[j] ) 
          {
        Type tmp = x[j - 1];
            x[j - 1] = x[j];
            x[j] = tmp;
          }
}
Luna17
 Аватар для Luna17
3 / 3 / 1
Регистрация: 09.03.2010
Сообщений: 95
05.05.2010, 18:15  [ТС]     Шаблон функции #10
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Luna17, кое что лишнее:
ой, точно, с переменными чуть намудрила, но ведь работает же
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
05.05.2010, 19:14     Шаблон функции #11
CyBOSSeR,

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
#include <iostream>
void bubbleSort(int& mas, int size){
    int tmp;
    for( int i=0; i < size; i++ ){
        for( int j=i; j>=0; --j){
            if ( mas[j] > mas[j+1] ){
                tmp=mas[j];
                mas[j]=mas[j+1];
                mas[j+1]=tmp;
            }
        }
    }
}
 
int main()
{
    int mas[5]={7,5,1,8,2};
    bubbleSort(mas,5);
 
    for( int i=0; i < 5; i++ )
    cout<<mas[i];
 
    return EXIT_SUCCESS;
}
а я тут массив по ссылке передаю, а в мэйне ошибка
invalid types `int[int]' for array subscript (строка 18)

чего не так то
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
05.05.2010, 21:06     Шаблон функции #12
PointsEqual, массивы передаются по указателю на первый элемент. int& mas - это ссылка на переменную целого типа, а не массива.
Измени int& mas на int* mas во второй строке и все должно быть нормально.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
05.05.2010, 22:10     Шаблон функции #13
CyBOSSeR, cо статическим понятно, спасибо, а с динамическим?


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
#include <iostream>
#include <vector>
 
 
template<class T>
void bubbleSort(T* mas, int size){
    T tmp;
    for( int i=0; i < size; i++ ){
        for( int j=i; j>=0; --j){
            if ( mas[j] > mas[j+1] ){
                tmp=mas[j];
                mas[j]=mas[j+1];
                mas[j+1]=tmp;
            }
        }
    }
}
 
 
 
 
 
int main()
{
 
    std::vector<int> mas(5);
    mas[0]=6;
    mas[1]=3;
    mas[2]=1;
    mas[3]=5;
    mas[4]=7;
 
    bubbleSort(mas,5);
 
 
    for( int i=0; i < 5; i++ )
    std::cout<<mas[i];
 
    return EXIT_SUCCESS;
}
ошибка no matching function for call to `bubbleSort(std::vector<int, std::allocator<int> >&, int)' (строка 33)
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
06.05.2010, 01:01     Шаблон функции #14
PointsEqual, std::vector это не массив.
Цитата Сообщение от PointsEqual Посмотреть сообщение
cо статическим понятно, спасибо, а с динамическим?
Точно также.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
06.05.2010, 01:28     Шаблон функции #15
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
std::vector это не массив.
а что это? разве не динамический массив?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
06.05.2010, 08:15     Шаблон функции #16
Цитата Сообщение от PointsEqual Посмотреть сообщение
а что это? разве не динамический массив?
Это вообще контейнер, а не массив, хоть и по стандарту элементы в STL-контейнерах должны лежать последовательно, как в обычных массивах, чтобы образаться с ними, как с обычными массивами. То есть вполне можно писать следующим образом:
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
#include <iostream>
#include <cstdlib>
#include <vector>
 
void sort(int * a, int l, int r)
{
   for(int i = l; i < r; i++)
      for(int j = r; j > i; j--)
         if(a[j-1] > a[j])
            std::swap(a[j-1], a[j]);
}
 
void random(int * a, int size)
{
   while(size--)
      *a++ = rand() % 9;
}
 
int main()
{
   std::vector<int> v(10); // int a[10]
 
   random(&v[0], 10);      // random(&a[0], 10)
 
   std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
   std::cout << std::endl;
 
   sort(&v[0], 0, 9);      // sort(&a[0], 0, 9)
 
   std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));
   std::cout << std::endl;
 
   system("pause");
   return 0;
}
Добавлено через 3 минуты
Цитата Сообщение от PointsEqual Посмотреть сообщение
cо статическим понятно, спасибо, а с динамическим?
когда есть запись:
Код
int a[n];
sort(a, n);
в функцию передается указатель на первый элемент массива,
если же есть запись:
Код
std::vector<int> v(n);
sort(v, n);
в функцию передается ссылка на объект std::vector, а никак не указатель int типа,
чтобы в данном случае получить указатель, необходимо взять адрес от первого элемента, то есть:
Код
sort(&v, n);
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
06.05.2010, 09:20     Шаблон функции #17
Цитата Сообщение от fasked Посмотреть сообщение
Это вообще контейнер, а не массив, хоть и по стандарту элементы в STL-контейнерах должны лежать последовательно, как в обычных массивах, чтобы образаться с ними, как с обычными массивами.
Дело не в том, как контейнер располагается в памяти, а в организации итераторов, которые позволяют обойти контейнер последовательно.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
06.05.2010, 15:31     Шаблон функции #18
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Дело не в том, как контейнер располагается в памяти, а в организации итераторов, которые позволяют обойти контейнер последовательно.
Я опираюсь на книгу "Эффективное использование STL" Мейерса.
Выражение v[0] дает ссылку на первый элемент, соответственно выражение &v[0] - указатель на первый элемент. В соответствии со стандатом С++ элементы vector должны храниться в памяти непрерывно, по аналогии с массивом.
Так здесь автор предлагает при передачи указателя на вектор в подобные функции пользоваться следующей записью:
Код
if(!v.empty())
   doSomething(&v[0], v.size());
Чтобы исключать вариант получения указателя на несуществующий элемент, что повлекло бы непредсказуемые последствия.
И далее...
Отдельные подозрительные личности утверждают, что &v[0] можно заменить на v.begin(), поскольку begin возвращает итератор, а для vector итератор в действительности представляет собой указатель. Во многих случаях это действительно так, но это правило соблюдается не всегда, и полагаться на него не стоит.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
06.05.2010, 19:50     Шаблон функции #19
fasked, вот сравни:
Цитата Сообщение от fasked Посмотреть сообщение
по стандарту элементы в STL-контейнерах должны лежать последовательно, как в обычных массивах
Цитата Сообщение от fasked Посмотреть сообщение
В соответствии со стандатом С++ элементы vector должны храниться в памяти непрерывно, по аналогии с массивом.
Просто прочитав первую фразу можно подумать, что элементы всех контейнеров STL располагаются в памяти последовательно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2010, 10:15     Шаблон функции
Еще ссылки по теме:

C++ c++ шаблон функции
Шаблон функции C++
Шаблон функции C++

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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
07.05.2010, 10:15     Шаблон функции #20
CyBOSSeR, ой да, сморозил конечно
Yandex
Объявления
07.05.2010, 10:15     Шаблон функции
Ответ Создать тему
Опции темы

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