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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.94
Ataman
1 / 1 / 1
Регистрация: 27.10.2011
Сообщений: 33
#1

Предикаты в STL - C++

21.07.2012, 14:02. Просмотров 2790. Ответов 10
Метки нет (Все метки)

Здравствуйте, не могу понять что должна принимать функция в качестве унарного предиката или бинарного. Вот допустим контейнер LIST, можете привести маленький пример пожалуйста?
0
Миниатюры
Предикаты в STL  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2012, 14:02
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Предикаты в STL (C++):

Предикаты STL - C++
Решил вот так простенькую задачку, в условии задачи" использовать указатели на функции и осортировать массив в порядке возрастания и...

STL функторы, предикаты - C++
У нас есть: std::multimap<std::string,std::string> map; нужно удалить все повторяющиеся ключи, используя алгоритм с предикатом. ...

структуры, предикаты - C++
Есть структура struct Group { Student* st; int cnt; }; в которой вложена struct Student { FullName name; Date dateBd; Date...

Магический квадрат, предикаты - C++
Доброе время суток, господа. Молю вас о помощи. Есть сие задание: Составить программу для решения одной из следующих задач....

Предикаты в функторах, нужно пояснение - C++
код сам по себе бестолковый, хочу сделать функтор для класса arrays(я новичок и только учусь). Как быть с предикатом?? #include<iostream>...

Предикаты. Выборка объектов из вектора по определённому полю - C++
Здравствуйте. Имеется некий шаблон класса, один из членов которого - вектор. Т.е. что-то вроде template <class T> class...

10
OstapBender
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
21.07.2012, 14:25 #2
принимает элемент типа листа T, возвращает bool

C++
1
2
3
4
5
6
bool isOdd(int i) {
return i&1;
}
 
std::list<int> l;
l.remove_if(isOdd);
1
nameless
Эксперт С++
338 / 302 / 14
Регистрация: 16.06.2009
Сообщений: 486
21.07.2012, 14:40 #3
Ataman,
Как вариант, можно в виде функционально объекта..

C++
1
2
3
4
5
6
7
8
9
10
template <typename T>
struct is_power_of_two : public std::unary_function <T, bool> {
   bool operator()(const T & value) const {
      return !(value & (value - 1));
   }
};
 
.......
 
list.remove_if(is_power_of_two <int>());
1
alex_x_x
бжни
2454 / 1659 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
21.07.2012, 14:55 #4
или std::binary_function
0
soon
2545 / 1310 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.07.2012, 16:43 #5
Цитата Сообщение от alex_x_x Посмотреть сообщение
или std::binary_function
Которые устарели.
0
modwind
52 / 52 / 1
Регистрация: 09.03.2012
Сообщений: 101
21.07.2012, 18:01 #6
Предикат - это нечто, похожее на функцию и возвращающее bool.
Унарный предикат принимает один аргумент типа T. Бинарный - 2.
Вот примеры предикатов (функция и класс):
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
#include <vector>
#include <algorithm>
using namespace std;
 
bool p1(int a)
{
    return true;
}
 
struct p2
{
    bool operator()(int a)
    {
        return true;
    }
};
 
int main()
{
    vector<int> v;
    remove_if(v.begin(),v.end(),p1);
    p2 obj;
    remove_if(v.begin(),v.end(),obj);
    return 0;
}
1
rangerx
1941 / 1550 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
21.07.2012, 20:52 #7
Цитата Сообщение от Ataman Посмотреть сообщение
Здравствуйте, не могу понять что должна принимать функция в качестве унарного предиката или бинарного.
UnPred pr - это функция(или функтор - объект класса умеющий притворяться функцией благодаря перегрузке оператора ()), которая проверяет переданный ей элемент списка на соответствие некоторому условию. Если это условие истинно, то элемент из списка будет удалён. Функторы являются более гибкими(а иногда и более эффективными(но это спорный вопрос )), чем функции поэтому предпочтение чаще всего отдаётся именно им.
Цитата Сообщение от Ataman Посмотреть сообщение
Вот допустим контейнер LIST, можете привести маленький пример пожалуйста?
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
47
48
49
50
51
52
#include <iostream>
#include <functional>
#include <iterator>
#include <string>
#include <list>
 
// функтор проверяющий наличие подстроки в строке
class contains : public std::unary_function<std::string, bool>
{
    private:
        std::string substr_;
    
    public:
        contains(const std::string& substr)
            : substr_(substr)
        {
            
        }
 
        // благодоря перегрузке этого оператора объект класса может "прикидываться" функцией
        bool operator () (const std::string& s) const
        {
            return s.find(substr_) != std::string::npos;
        }
};
 
int main()
{
    typedef std::ostream_iterator<std::string> string_ostream_iter_t;
    typedef std::list<std::string> string_list_t;
    //-----------------------
 
    string_list_t lst;
 
    // заполняем список
    lst.push_back("one");
    lst.push_back("two");
    lst.push_back("three");
    lst.push_back("four");
    lst.push_back("five");
 
    // удаляем строки содержащие букву "о"  
    lst.remove_if(contains("o"));
    
    // а так можно удалить строки НЕ содержащие букву "o"
    // в частности для того чтобы это работало contains и был унаследован от std::unary_function
    // lst.remove_if(std::not1(contains("o")));
    
    // выводим оставшиеся элементы списка на экран
    std::copy(lst.begin(), lst.end(), 
              string_ostream_iter_t(std::cout, "\n"));
}
1
ForEveR
В астрале
Эксперт С++
7992 / 4751 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
21.07.2012, 22:40 #8
Оставляет в контейнере только нечетные члены. С++11.

C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <list>
#include <algorithm>
#include <iterator>
 
int main()
{
   std::list<int> lst = {1,2,3,4,5};
   lst.erase(std::remove_if(lst.begin(), lst.end(), [](const int c) { return c % 2 == 0; }), lst.end());
   std::copy(lst.begin(), lst.end(), std::ostream_iterator<int>(std::cout, " "));
}
http://liveworkspace.org/code/71b80f09c8a1e8f9a0fe40cebaa1c620
1
Ataman
1 / 1 / 1
Регистрация: 27.10.2011
Сообщений: 33
22.07.2012, 01:01  [ТС] #9
спасибо большое

Добавлено через 1 час 57 минут
Скажите почему не получается у меня использовать стандартные функторы, такие как less, equal_to?

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 <algorithm>
#include <list>
#include <functional>
using namespace std;
 
void main(){
    list<int> l1, l2(3,1);
    short i;
    list<int>::iterator start=l1.begin();
    for(i=0; i<10; i++, start++){
        l1.push_back(rand()%100);
        cout << *start << "  ";
    }//for
    cout<<endl;
 
    start=l1.begin();
    advance(start,3);
    cout << "start=" << *start <<endl;
 
    l2.remove_if(equal_to(4));  //error
 
}//main
0
Avazart
Эксперт С++
7574 / 5559 / 327
Регистрация: 10.12.2010
Сообщений: 24,934
Записей в блоге: 17
22.07.2012, 02:03 #10
Наверное:
C++
1
l2.remove_if(equal_to<int>(4));
0
ForEveR
В астрале
Эксперт С++
7992 / 4751 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
22.07.2012, 05:57 #11
Avazart, Нет.
C++
1
std::bind2nd(std::equal_to<int>(), 4);
http://liveworkspace.org/code/99ad950c82c91d088484f00fdbc1a5f6
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2012, 05:57
Привет! Вот еще темы с ответами:

Предикаты\Функторы - C++
Здравствуйте, взялся за прочтение алгоритмов STL и наткнулся на такой вопрос, что же такое Предикаты\Функторы. Определения и примеры я...

Функторы, предикаты, функциональные адаптеры, лямбда-функции - C++
Вступление Статья ориентирована на программистов С++, поверхностно знающих/желающих узнать STL, в особенности, с использованием его...

STL - C++
помогите,нужно написать прогу,чтоб каждый отрицательный элемент последовательности заменить на его квадрат.это всё при помощи STL

STL - C++
Задача: сторонами треугольников и прямоугольников являются цветные (red, green, blue) lego-палстины с соответствующим количеством узлов....


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

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

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