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

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

Восстановить пароль Регистрация
 
KostyaKulakov
Заблокирован
12.03.2013, 16:39     отличие функтора от функции #1
в чём собственно отличие?

имеется виду std::sort
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ITcrusader
Эксперт C++
 Аватар для ITcrusader
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++
 Аватар для ITcrusader
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
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,629
Записей в блоге: 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++ Использование собственного функтора со связывателями
Функции работы со строками, отличие функций с добавлением _s C++
C++ Отличие Myclass& от Myclass* в аргументах функции

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

Или воспользуйтесь поиском по форуму:
ITcrusader
Эксперт C++
 Аватар для ITcrusader
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     отличие функтора от функции
Ответ Создать тему
Опции темы

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