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

Пара вопросов по функторам stl - C++

Восстановить пароль Регистрация
 
Leningradec
0 / 0 / 0
Регистрация: 21.11.2010
Сообщений: 30
21.01.2011, 00:54     Пара вопросов по функторам stl #1
Доброго времени суток!
У меня возникло пара вопросов по функторам. Может кто чего подскажет?
Вопрос 1.
В нижеследующем коде в стандартном алгоритме for_each используется функтор IsEvan. Почему мы можем использовать функтор таким вот образом? Разве не логичней сначала создать объект класса IsEvan и именно его использовать в алгоритме?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class IsEvan
{
public:
    void operator()(int num)
    {
        if(num%2==0)
            cout<<num<<" ";
    }
};
 
int main()
{
    vector<int> vec;
    for(int i=1; i<11; i++)
        vec.push_back(i);
        for_each(vec.begin(),vec.end(),IsEvan());
    return 0;
}
Вопрос 2.
Пытаюсь применить стандартный отрицатель unary_negate. Не знаю, как правильно его вызвать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class predicate: public unary_function<int,bool>
{
public:
    bool operator()(int num) const
    {
        return num<=5;
    }
};
 
int main()
{
    vector<int> vec;
    for(int i=1; i<11; i++)
        vec.push_back(i);
    cout<<*find_if(vec.begin(),vec.end(),unary_negate<predicate()>()); // Не знаю, как правильно написать эту строку
    return 0;
}
Зачем нужны отрицатели unary_negate, если есть стандартные функции not1 и not2 ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2011, 00:54     Пара вопросов по функторам stl
Посмотрите здесь:

пара вопросов по GUI C++
C++ вставление строк и пара вопросов
C++ Пара вопросов по С++
Пара вопросов про массивы C++
Пара вопросов по итераторам C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
21.01.2011, 01:03     Пара вопросов по функторам stl #2
Цитата Сообщение от Leningradec Посмотреть сообщение
Разве не логичней сначала создать объект класса IsEvan и именно его использовать в алгоритме?
Раз уже зашла речь о том "что будет логичней", то делай так
C++
1
2
3
4
5
6
7
8
int main()
{
        vector<int> vec;
        for(int i=1; i<11; i++)
                vec.push_back(i);
        for_each(vec.begin(),vec.end(),[](int a) {if( !(a % 2) ) std::cout << a << ' ';});
        return 0;
}
это по стандарту C++0x.
Leningradec
0 / 0 / 0
Регистрация: 21.11.2010
Сообщений: 30
21.01.2011, 01:11  [ТС]     Пара вопросов по функторам stl #3
Цитата Сообщение от asics Посмотреть сообщение
Раз уже зашла речь о том "что будет логичней", то
Перефразирую вопрос: почему в этом коде используется функтор без создания объекта класса IsEvan?
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
21.01.2011, 01:15     Пара вопросов по функторам stl #4
1.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <vector>
#include <algorithm>
 
class IsEvan
{
public:
        void operator()(int num)
        {
                if(num%2==0)
                        std::cout<<num<<" ";
        }
};
 
int main()
{
        std::vector<int> vec;
        for(int i=1; i<11; i++)
                vec.push_back(i);
        IsEvan ise;
        for_each(vec.begin(),vec.end(),ise);
        return 0;
}
http://liveworkspace.org/code/abf19a...b5ab91740c5f4b
Leningradec
0 / 0 / 0
Регистрация: 21.11.2010
Сообщений: 30
21.01.2011, 01:24  [ТС]     Пара вопросов по функторам stl #5
niXman, я знаю, что можно создать объект и использовать его. Вопрос в другом - почему можно использовать функтор вот так: IsEvan()? Без создания объекта?
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
21.01.2011, 01:25     Пара вопросов по функторам stl #6
Leningradec, IsEven() — и есть создание нового объекта, т.к. это вызов конструктора.
Leningradec
0 / 0 / 0
Регистрация: 21.11.2010
Сообщений: 30
21.01.2011, 01:31  [ТС]     Пара вопросов по функторам stl #7
volovzi, блин, точно! что-то я ступил ((
а по второму вопросу есть мнения???
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
21.01.2011, 01:39     Пара вопросов по функторам stl #8
а я сижу, гляжу в написанное, и пытаюсь понять, о чем это ТС...
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
21.01.2011, 01:40     Пара вопросов по функторам stl #9
Leningradec, а что ты хочешь сделать? Сменить знак всех элементов массива?
Leningradec
0 / 0 / 0
Регистрация: 21.11.2010
Сообщений: 30
21.01.2011, 01:47  [ТС]     Пара вопросов по функторам stl #10
volovzi, да я просто хочу разобраться, как использовать стандартные отрицатели. без привязки к какой-либо задаче
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
21.01.2011, 01:57     Пара вопросов по функторам stl #11
Leningradec, все функторы используются одинаково. А именно, в алгоритм подставляется экземпляр этого класса.
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,651
21.01.2011, 02:11     Пара вопросов по функторам stl #12
1)
Временный объект, создаваемый явным вызовом конструктора здесь удобнее, так как объект функтора здесь передается в алгоритм по значению, и после копирования больше не нужен.
2)
Функторы std::unary_negate и std::binary_negate удобнее использовать не напрямую, а используя функции std::not1 и std::not2 создающие объекты этих функторов.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2011, 02:18     Пара вопросов по функторам stl
Еще ссылки по теме:

C++ Пара вопросов о рандомайзере и RadioButton
Пара глупых вопросов C++
C++ Пара вопросов по C++ 11

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

Или воспользуйтесь поиском по форуму:
Leningradec
0 / 0 / 0
Регистрация: 21.11.2010
Сообщений: 30
21.01.2011, 02:18  [ТС]     Пара вопросов по функторам stl #13
volovzi, в итоге сделал вот так и все заработало:
C++
1
cout<<*find_if(vec.begin(),vec.end(),unary_negate<predicate>(predicate()));
Спасибо за помощь!

Добавлено через 2 минуты
Mr.X, спасибо! я разобрался!
Yandex
Объявления
21.01.2011, 02:18     Пара вопросов по функторам stl
Ответ Создать тему
Опции темы

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