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

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

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

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

21.01.2011, 00:54. Просмотров 646. Ответов 12
Метки нет (Все метки)

Доброго времени суток!
У меня возникло пара вопросов по функторам. Может кто чего подскажет?
Вопрос 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 ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2011, 00:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Пара вопросов по функторам stl (C++):

Пара вопросов по С++ - C++
возникло несколько вопросов, с которыми что то не могу никак разобраться 1. Как происходит выравнивание при создании структуры? ...

Пара вопросов по C++ 11 - C++
1. чем отличаются std::forward_list и std::initializer_list? 2. не получается применять constexpr в msvs 2013 pro constexpr auto n = 0;...

пара вопросов по GUI - C++
1) итак, посмотрел Inter PRO одного банка. При наборе в IE адреса он каким-то образом переадресует запущенному Inter PRO, он в свою очередь...

Пара глупых вопросов - C++
Помогите please,please,please. Не могу понять в чем туплю, надо всего-то записать двумерный массив в файл ну и я пишу (Уже есть массив...

Пара вопросов по итераторам - C++
1. Почему в этом коде элементы удаляются через одного? for (std::vector &lt;int&gt;::iterator j = vector.begin(); j &lt; vector.end(); j++) ...

Пара вопросов о рандомайзере и RadioButton - C++
1) srand((unsigned)time(NULL)); int rand_ = rand()%10; rand_ будет равен от 0 до 9 включительно или от 0 до 10 включительно? ...

12
asics
Freelance
Эксперт С++
2848 / 1783 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
21.01.2011, 01:03 #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.
1
Leningradec
0 / 0 / 0
Регистрация: 21.11.2010
Сообщений: 30
21.01.2011, 01:11  [ТС] #3
Цитата Сообщение от asics Посмотреть сообщение
Раз уже зашла речь о том "что будет логичней", то
Перефразирую вопрос: почему в этом коде используется функтор без создания объекта класса IsEvan?
0
niXman
Эксперт С++
3138 / 1450 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
21.01.2011, 01:15 #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/abf19ae0b4358d16b0b5ab91740c5f4b
1
Leningradec
0 / 0 / 0
Регистрация: 21.11.2010
Сообщений: 30
21.01.2011, 01:24  [ТС] #5
niXman, я знаю, что можно создать объект и использовать его. Вопрос в другом - почему можно использовать функтор вот так: IsEvan()? Без создания объекта?
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
21.01.2011, 01:25 #6
Leningradec, IsEven() — и есть создание нового объекта, т.к. это вызов конструктора.
1
Leningradec
0 / 0 / 0
Регистрация: 21.11.2010
Сообщений: 30
21.01.2011, 01:31  [ТС] #7
volovzi, блин, точно! что-то я ступил ((
а по второму вопросу есть мнения???
0
niXman
Эксперт С++
3138 / 1450 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
21.01.2011, 01:39 #8
а я сижу, гляжу в написанное, и пытаюсь понять, о чем это ТС...
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
21.01.2011, 01:40 #9
Leningradec, а что ты хочешь сделать? Сменить знак всех элементов массива?
0
Leningradec
0 / 0 / 0
Регистрация: 21.11.2010
Сообщений: 30
21.01.2011, 01:47  [ТС] #10
volovzi, да я просто хочу разобраться, как использовать стандартные отрицатели. без привязки к какой-либо задаче
0
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
21.01.2011, 01:57 #11
Leningradec, все функторы используются одинаково. А именно, в алгоритм подставляется экземпляр этого класса.
0
Mr.X
Эксперт С++
3050 / 1695 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
21.01.2011, 02:11 #12
1)
Временный объект, создаваемый явным вызовом конструктора здесь удобнее, так как объект функтора здесь передается в алгоритм по значению, и после копирования больше не нужен.
2)
Функторы std::unary_negate и std::binary_negate удобнее использовать не напрямую, а используя функции std::not1 и std::not2 создающие объекты этих функторов.
0
Leningradec
0 / 0 / 0
Регистрация: 21.11.2010
Сообщений: 30
21.01.2011, 02:18  [ТС] #13
volovzi, в итоге сделал вот так и все заработало:
C++
1
cout<<*find_if(vec.begin(),vec.end(),unary_negate<predicate>(predicate()));
Спасибо за помощь!

Добавлено через 2 минуты
Mr.X, спасибо! я разобрался!
0
21.01.2011, 02:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2011, 02:18
Привет! Вот еще темы с ответами:

Пара вопросов про массивы - C++
у меня есть пара вопросов,хотя один можно сказать относится к функциям..но тема у нас в курсе-массивы. Так вот: 1.void main() { const...

вставление строк и пара вопросов - C++
вычислить и вывести на экран в виде таблицы значение функции F на интервале от Xнач до Xконч с шагом Dx задана система: ...

Конструкторы и деструкторы при наследовании. Пара вопросов - C++
1. Можно ли создавать виртуальный конструктор/деструктор и переопределять его без создания нового конструктора в производном классе? 2....

ifstream пара вопросов - C++
ifstream in(&quot;a.in&quot;); if (!in) { cout &lt;&lt; &quot;It`s impossible to open file!\n&quot;; }; объясните...


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

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

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