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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Minor1310
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 23
#1

Определение функций сортировок в классе - C++

10.04.2013, 00:53. Просмотров 383. Ответов 7
Метки нет (Все метки)

Есть класс содержащий к примеру 2 функции сортировки(выбором и пузырьком) в которые передается интовый массив. Из методов реализации сортировок найдены:
1) выбором
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template< class T >
void selectSort(T* arr, int size) 
{
    T tmp;
    for(int i = 0; i < size; ++i) // i - номер текущего шага
    { 
        int pos = i; 
        tmp = arr[i];
        for(int j = i + 1; j < size; ++j) // цикл выбора наименьшего элемента
        {
            if (arr[j] < tmp) 
           {
               pos = j; 
               tmp = arr[j]; 
           }
        }
        arr[pos] = arr[i]; 
        arr[i] = tmp; // меняем местами наименьший с a[i]
    }
}
и пузырьком
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template< class T >
void bubbleSort(T* arr, int size)
{
    T tmp;
 
    for(int i = 0; i < size - 1; ++i) // i - номер прохода
    {            
        for(int j = 0; j < size - 1; ++j) // внутренний цикл прохода
        {     
            if (arr[j + 1] < arr[j]) 
            {
                tmp = arr[j + 1]; 
                arr[j + 1] = arr[j]; 
                arr[j] = tmp;
            }
        }
    }
}
Вопрос такого плана как реализовать их внутри-классово без шаблонов?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2013, 00:53     Определение функций сортировок в классе
Посмотрите здесь:
Итерационные циклы,Определение и вызов функций,Использование библиотечных функций stdio.h C++
Определение класса в шаблонном классе C++
C++ Перегрузка функций в классе
C++ Классы: определение идентификатора класса, в другом классе
Отличаются ли обычные функции от функций в классе? C++
C++ Написание функций, которые объявлены в абстрактном классе
Итераторы, как параметры лябда-функций в шаблонном классе C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
abit
262 / 261 / 33
Регистрация: 03.02.2013
Сообщений: 718
10.04.2013, 01:09     Определение функций сортировок в классе #2
не ясно...

сперва Вы пишете
Есть класс содержащий
...
в конце вопрос
как реализовать их внутри-классово
взаимоисключающие параграфы...
если класс их содержит, то они "внутри-классово"

а если речь идёт - избавиться от temlate - то это просто, предоставьте тип, над которым должны работать эти фнункции

шаблоны для того и нужны, что неизвестен тип с которым надо работать, дайте тип, с которым надо выполнить функцию )
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,495
Записей в блоге: 4
10.04.2013, 01:32     Определение функций сортировок в классе #3
Ещё можно не отказываясь от определённого шаблонного метода его перегрузить конкретным типом. В этом случае при вызове с этим типом будет работать именно перегруженный.
Minor1310
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 23
10.04.2013, 01:33  [ТС]     Определение функций сортировок в классе #4
Цитата Сообщение от abit Посмотреть сообщение
не ясно...

сперва Вы пишете
...
в конце вопрос


взаимоисключающие параграфы...
если класс их содержит, то они "внутри-классово"

а если речь идёт - избавиться от temlate - то это просто, предоставьте тип, над которым должны работать эти фнункции

шаблоны для того и нужны, что неизвестен тип с которым надо работать, дайте тип, с которым надо выполнить функцию )
Суть вопроса про избавиться от temlate вы поняли правильно), у меня тип - инт, можете продемонстрировать код на примере одной из функций? а то уже соображается плоховато ночью)
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6444 / 3083 / 306
Регистрация: 04.12.2011
Сообщений: 8,495
Записей в блоге: 4
10.04.2013, 01:52     Определение функций сортировок в классе #5
Цитата Сообщение от Minor1310 Посмотреть сообщение
Есть класс содержащий к примеру 2 функции сортировки(выбором и пузырьком) в которые передается интовый массив. Из методов реализации сортировок найдены:
1) выбором
Вопрос такого плана как реализовать их внутри-классово без шаблонов?
Вот перегрузка шаблона на тип int (специализация):
C++
1
2
3
4
5
6
7
8
void selectSort<int>(int* arr, int size)  
{
    T tmp;
    for(int i = 0; i < size; ++i) // i - номер текущего шага
    { 
       //и тп.
    }
}
Вот перегрузка без шаблона:
C++
1
2
3
4
5
6
7
8
void selectSort(int* arr, int size) 
{
    T tmp;
    for(int i = 0; i < size; ++i) // i - номер текущего шага
    { 
       //и тп.
    }
}
Но... обычно в классе определяют операторы сравнения (главным образом < ) и передают в метод сортировки где эти операции используются. То есть стандартно это можно представить так например:
-определяем bool operator<()
-заполняем контейнер (vector) экземплярами класса
-вызываем sort(ier1, iter2) //подключить <algorithm>
то есть следуя этой логике сортировку вообще не стоит реализовывать в классе. А методов сравнения можно определить несколько:
bool comp1()
bool comp2()
....
bool compn()
тогда каждый раз когда нужно сортировать по определенному критерию и параметру вызывается перегруженная
sort( , , A::compk()) //функция сравнения передаётся
abit
262 / 261 / 33
Регистрация: 03.02.2013
Сообщений: 718
10.04.2013, 01:54     Определение функций сортировок в классе #6
Цитата Сообщение от Minor1310 Посмотреть сообщение
Суть вопроса про избавиться от temlate вы поняли правильно), у меня тип - инт, можете продемонстрировать код на примере одной из функций? а то уже соображается плоховато ночью)
почему нет? могу

вот Ваш шаблон

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template< class T >
void selectSort(T* arr, int size) 
{
    T tmp;
    for(int i = 0; i < size; ++i) // i - номер текущего шага
    { 
        int pos = i; 
        tmp = arr[i];
        for(int j = i + 1; j < size; ++j) // цикл выбора наименьшего элемента
        {
            if (arr[j] < tmp) 
           {
               pos = j; 
               tmp = arr[j]; 
           }
        }
        arr[pos] = arr[i]; 
        arr[i] = tmp; // меняем местами наименьший с a[i]
    }
}
приводим его к типу int вместо class T:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void selectSort(int * arr, int size) 
{
    int tmp;
    for(int i = 0; i < size; ++i) // i - номер текущего шага
    { 
        int pos = i; 
        tmp = arr[i];
        for(int j = i + 1; j < size; ++j) // цикл выбора наименьшего элемента
        {
            if (arr[j] < tmp) 
           {
               pos = j; 
               tmp = arr[j]; 
           }
        }
        arr[pos] = arr[i]; 
        arr[i] = tmp; // меняем местами наименьший с a[i]
    }
}
собстна изменений чуть-чуть но идея я думаю понятна )
Minor1310
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 23
10.04.2013, 01:59  [ТС]     Определение функций сортировок в классе #7
Цитата Сообщение от IGPIGP Посмотреть сообщение
Вот перегрузка шаблона на тип int (специализация):
C++
1
2
3
4
5
6
7
8
void selectSort<int>(int* arr, int size)  
{
    T tmp;
    for(int i = 0; i < size; ++i) // i - номер текущего шага
    { 
       //и тп.
    }
}
Вот перегрузка без шаблона:
C++
1
2
3
4
5
6
7
8
void selectSort(int* arr, int size) 
{
    T tmp;
    for(int i = 0; i < size; ++i) // i - номер текущего шага
    { 
       //и тп.
    }
}
Но... обычно в классе определяют операторы сравнения (главным образом < ) и передают в метод сортировки где эти операции используются. То есть стандартно это можно представить так например:
-определяем bool operator<()
-заполняем контейнер (vector) экземплярами класса
-вызываем sort(ier1, iter2) //подключить <algorithm>
то есть следуя этой логике сортировку вообще не стоит реализовывать в классе. А методов сравнения можно определить несколько:
bool comp1()
bool comp2()
....
bool compn()
тогда каждый раз когда нужно сортировать по определенному критерию и параметру вызывается перегруженная
sort( , , A::compk()) //функция сравнения передаётся
Спасибо

Добавлено через 46 секунд
Цитата Сообщение от abit Посмотреть сообщение
почему нет? могу

вот Ваш шаблон

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template< class T >
void selectSort(T* arr, int size) 
{
    T tmp;
    for(int i = 0; i < size; ++i) // i - номер текущего шага
    { 
        int pos = i; 
        tmp = arr[i];
        for(int j = i + 1; j < size; ++j) // цикл выбора наименьшего элемента
        {
            if (arr[j] < tmp) 
           {
               pos = j; 
               tmp = arr[j]; 
           }
        }
        arr[pos] = arr[i]; 
        arr[i] = tmp; // меняем местами наименьший с a[i]
    }
}
приводим его к типу int вместо class T:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void selectSort(int * arr, int size) 
{
    int tmp;
    for(int i = 0; i < size; ++i) // i - номер текущего шага
    { 
        int pos = i; 
        tmp = arr[i];
        for(int j = i + 1; j < size; ++j) // цикл выбора наименьшего элемента
        {
            if (arr[j] < tmp) 
           {
               pos = j; 
               tmp = arr[j]; 
           }
        }
        arr[pos] = arr[i]; 
        arr[i] = tmp; // меняем местами наименьший с a[i]
    }
}
собстна изменений чуть-чуть но идея я думаю понятна )
Премного благодарен!) Теперь понял что от меня хотят а то кофе уже не спасает=D
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2013, 02:26     Определение функций сортировок в классе
Еще ссылки по теме:
C++ определение функций
Определение и вызов функций C++
Определение и вызов функций C++
Определение и вызов функций C++
странное определение функций C++

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

Или воспользуйтесь поиском по форуму:
abit
262 / 261 / 33
Регистрация: 03.02.2013
Сообщений: 718
10.04.2013, 02:26     Определение функций сортировок в классе #8
но вообще если нужен профессиональный уровень вместо сигнатуры
void selectSort(int * arr, int size)

используйте
void selectSort(int * arr, size_t size), void selectSort(int * arr, srd::size_t size). void selectSort(int * arr, srd::size_type size)
зависит от локального применения, но int/unsigned int не рекомендую использовать для индексов/размеров массивов
Yandex
Объявления
10.04.2013, 02:26     Определение функций сортировок в классе
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru