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

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

Восстановить пароль Регистрация
 
Minor1310
0 / 0 / 0
Регистрация: 11.02.2013
Сообщений: 23
10.04.2013, 00:53     Определение функций сортировок в классе #1
Есть класс содержащий к примеру 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     Определение функций сортировок в классе
Посмотрите здесь:

Определение и вызов функций C++
C++ определение функций
C++ Перегрузка функций в классе
Определение и вызов функций C++
странное определение функций C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
10.04.2013, 01:09     Определение функций сортировок в классе #2
не ясно...

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

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

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

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


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

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

шаблоны для того и нужны, что неизвестен тип с которым надо работать, дайте тип, с которым надо выполнить функцию )
Суть вопроса про избавиться от temlate вы поняли правильно), у меня тип - инт, можете продемонстрировать код на примере одной из функций? а то уже соображается плоховато ночью)
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6160 / 2889 / 282
Регистрация: 04.12.2011
Сообщений: 7,689
Записей в блоге: 3
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
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
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++

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

Или воспользуйтесь поиском по форуму:
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
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     Определение функций сортировок в классе
Ответ Создать тему
Опции темы

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