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

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

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

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

10.04.2013, 00:53. Просмотров 389. Ответов 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;
            }
        }
    }
}
Вопрос такого плана как реализовать их внутри-классово без шаблонов?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2013, 00:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Определение функций сортировок в классе (C++):

Итерационные циклы,Определение и вызов функций,Использование библиотечных функций stdio.h - C++
Помогите решить задания: 1.Дано натуральное число n. Найти разность между первой цифрой этого числа и суммой всех остальных. ...

Определение класса в шаблонном классе - C++
Помогите разобраться с тем, как синтаксически правильно давать определения методов подкласса шаблонного класса и методов шаблонного класса,...

Перегрузка функций в классе - C++
Дано задание: 1.реализовать в классе работу стека; 2.применить перегрузку функций. Первое я реализовал без проблем, а вот со вторым...

Классы: определение идентификатора класса, в другом классе - C++
Доброго времени суток:) Проблема в не знании, как идентифицировать переменную, использовавшаяся в другом классе. // 1 IntelliSense:...

Отличаются ли обычные функции от функций в классе? - C++
отличаются ли они?

Написание функций, которые объявлены в абстрактном классе - C++
Добрый день. Подскажите, как написать тело функций, которые объявлены в абстрактном классе. Абстрактный класс: class OSM_EXPORT...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
abit
262 / 261 / 33
Регистрация: 03.02.2013
Сообщений: 722
10.04.2013, 01:09 #2
не ясно...

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

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

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

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


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

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

шаблоны для того и нужны, что неизвестен тип с которым надо работать, дайте тип, с которым надо выполнить функцию )
Суть вопроса про избавиться от temlate вы поняли правильно), у меня тип - инт, можете продемонстрировать код на примере одной из функций? а то уже соображается плоховато ночью)
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6471 / 3119 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 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()) //функция сравнения передаётся
1
abit
262 / 261 / 33
Регистрация: 03.02.2013
Сообщений: 722
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]
    }
}
собстна изменений чуть-чуть но идея я думаю понятна )
1
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
0
abit
262 / 261 / 33
Регистрация: 03.02.2013
Сообщений: 722
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 не рекомендую использовать для индексов/размеров массивов
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2013, 02:26
Привет! Вот еще темы с ответами:

Классы (Использование функций класса в другом классе) - C++
Доброго времени суток. У меня есть 3 класса: Forest, Plants и Grass. Хочу сделать, чтобы через указатель на объект класса Forest я мог...

Итераторы, как параметры лябда-функций в шаблонном классе - C++
Доброго здоровья! Есть такой код (упрощенный вариант для наглядного описания ситуации): template&lt;typename Type&gt; struct A { ...

определение функций - C++
Подскажите пожалуйста, как определить функцию используя массивы. В чем мои ошибки в этой программе? #include&lt;iostream&gt; char...

Определение и вызов функций - C++
Всем привет. Записать алгоритм, проверяющий является ли заданное число простым как рекурсивную функцию. Вывести на экран все простые...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.04.2013, 02:26
Ответ Создать тему
Опции темы

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