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

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

Войти
Регистрация
Восстановить пароль
 
KostyaKulakov
Заблокирован
#1

Отличие функтора от функции - C++

12.03.2013, 16:39. Просмотров 540. Ответов 6
Метки нет (Все метки)

в чём собственно отличие?

имеется виду std::sort
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.03.2013, 16:39     Отличие функтора от функции
Посмотрите здесь:

Использование собственного функтора со связывателями - C++
Не могу правильно написать функтор, чтобы его можно было использовать с биндом. Вот пример на сравнение строк без учета регистра: ...

Отличие static от объявление переменных ДО функции main - C++
Может быть я не совсем точно выразился в заголовке. Интересует отличие объявление переменных ДО функции main и объявление через static. По...

Функции работы со строками, отличие функций с добавлением _s - C++
При работе с строками в VS 2012, увидел от него предупреждение при использовании функций gets(), strcat() и др. Ругается что они являются...

Поля, переменные; Методы, функции; В чем отличие? - C++
Насколько я понимаю, "поля" - это и есть "переменные", а "методы" - это "функции"; Недавно преподаватель задал вопрос: "Какое у них...

Отличие Myclass& от Myclass* в аргументах функции - C++
Доброго времени суток. Новичок в С++ (раньше писал на всяких питонах и пхп). Очень нравится язык, прям каждый раз, когда что-то новое...

Отличие функции cin.get и cin.getline - C++
Добрый день! Изучаю функции get и getline, сказано, что они отличаются тем, что функция get считывает символ разрыва строк и оставляет...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
12.03.2013, 16:43     Отличие функтора от функции #2
На результате работы sort - не отражается отличие.
Единственное - функтор - это объект класса, а значит может иметь свои члены (поля, конструкторы, деструкторы,...), короче, ему присущи все свойства класса. Т.е. с его помощью можно решить более нетривиальную задачу.

Если, конечно, под функтором имеется в виду функциональный объект
KostyaKulakov
Заблокирован
12.03.2013, 16:45  [ТС]     Отличие функтора от функции #3
как реализовать тут функтор, заместо ф-ци

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
/*Code by Kostya Kulakov*/
 
#include <iostream>
#include <string>    // std::string
#include <algorithm> // std::sort
 
#define ARRAY_SIZE(x) sizeof(x)/sizeof(0[x])
 
struct User
{
    std::string Name;
    std::string LastName;
};
 
void PrintUser(const User user[], size_t size);
 
bool UserCMP(const User a, const User b)
{
    return a.Name < b.Name;
}
 
int main()
{
 
    User user[] = { {"Kostya", "Kulakov"     },
                    {"Irina" , "Ryzhova"     },
                    {"Vasya" , "Pupkin"      },
                    {"Artem" , "Dobrovolskiy"}
                  };
 
    PrintUser(user, ARRAY_SIZE(user));
 
    std::sort(&user[0], &user[4], UserCMP);
 
    PrintUser(user, ARRAY_SIZE(user));
 
    return 0;
}
 
void PrintUser(const User* user, size_t size)
{
    for(int i = 0; i < size; ++i)
        std::cout << user[i].Name << " " << user[i].LastName << std::endl; 
 
    std::cout << std::endl;
}
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
12.03.2013, 16:51     Отличие функтора от функции #4
C++
1
2
3
4
5
6
7
8
9
10
11
class UserComparator
{
public:
    bool operator()(const User& lhs, const User& rhs)
    {
        return lhs.Name < rhs.Name;
    }
};
 
// вызов
std::sort(&user[0], &user[4], UserComparator());
Avazart
Эксперт С++
7115 / 5292 / 273
Регистрация: 10.12.2010
Сообщений: 23,381
Записей в блоге: 17
12.03.2013, 16:57     Отличие функтора от функции #5
Как я помню ф-циональные объекты в добавок могут быстрее выполнятся...
KostyaKulakov
Заблокирован
12.03.2013, 16:58  [ТС]     Отличие функтора от функции #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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/*Code by Kostya Kulakov*/
 
#include <iostream>
#include <string>    // std::string
#include <algorithm> // std::sort
 
#define ARRAY_SIZE(x) sizeof(x)/sizeof(0[x])
 
struct User
{
    std::string Name;
    std::string LastName;
 
    bool operator()(const User a, const User b)
    {
        return a.Name < b.Name;
    }
};
 
void PrintUser(const User user[], size_t size);
 
int main()
{
 
    User user[] = { {"Kostya", "Kulakov"     },
                    {"Irina" , "Ryzhova"     },
                    {"Vasya" , "Pupkin"      },
                    {"Artem" , "Dobrovolskiy"}
                  };
 
    PrintUser(user, ARRAY_SIZE(user));
 
    std::sort(&user[0], &user[4], User());
 
    PrintUser(user, ARRAY_SIZE(user));
 
    return 0;
}
 
void PrintUser(const User* user, size_t size)
{
    for(int i = 0; i < size; ++i)
        std::cout << user[i].Name << " " << user[i].LastName << std::endl; 
 
    std::cout << std::endl;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2013, 17:14     Отличие функтора от функции
Еще ссылки по теме:

Отличие С от С++ - C++
В чем отличие языка С от С++

Отличие функций [объясните] - C++
ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen));...

Отличие итератора от foreach - C++
Есть ли разница между циклами? std::vector&lt;int&gt; vec; vec.push_back(4); vec.push_back(5); vec.push_back(6); for...

Отличие cout от printf - C++
Всем добрый день! у меня такой вопрос: чем отличается cout от printf? у меня есть программа, если я printf заменяю на cout, то выводит...


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

Или воспользуйтесь поиском по форуму:
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
12.03.2013, 17:14     Отличие функтора от функции #7
Синтаксически - да. Но если не ошибаюсь, каждый раз при вызове operator() должен создан быть экземпляр предварительно. Получается, что при этом выполняются лишние конструкторы агрегированных полей каждый раз, когда вызывается сравнение (и конструктор самого класса). И это еще маленький класс у тебя в проге, а вдруг там змей горыныч какой будет...

Мне думается, что корректнее делать его внешним. Если неправ - думаю, меня поправят.

И еще:
Так не пиши
C++
1
bool operator()(const User a, const User b)
Так пиши
C++
1
bool operator()(const User& a, const User& b)
Yandex
Объявления
12.03.2013, 17:14     Отличие функтора от функции
Ответ Создать тему
Опции темы

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