С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

имеется виду std::sort
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.03.2013, 16:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Отличие функтора от функции (C++):

Непонятное поведение функтора - C++
Почему-то не считается произведение 1 и 6 ... #include <iostream> #include <algorithm> #include <functional> #include <vector> ...

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

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

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

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

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

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

Если, конечно, под функтором имеется в виду функциональный объект
0
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;
}
0
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());
1
Avazart
Эксперт С++
7238 / 5434 / 304
Регистрация: 10.12.2010
Сообщений: 24,156
Записей в блоге: 17
12.03.2013, 16:57 #5
Как я помню ф-циональные объекты в добавок могут быстрее выполнятся...
1
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;
}
0
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)
1
12.03.2013, 17:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2013, 17:14
Привет! Вот еще темы с ответами:

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

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

Отличие // от /// и /** */ от /* */ - C++
В чем их отличия?

В чем отличие While от Do... While? - C++
Я понял ,что в While сначала проверяется условие,а потом если оно истинно выполняются операторы,а в Do...while все наоборот . Как я...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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