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

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

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

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

Предикаты STL
Решил вот так простенькую задачку, в условии задачи" использовать указатели на...

STL функторы, предикаты
У нас есть: std::multimap<std::string,std::string> map; нужно удалить...

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

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

Предикаты в функторах, нужно пояснение
код сам по себе бестолковый, хочу сделать функтор для класса arrays(я новичок и...

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

10
OstapBender
584 / 523 / 75
Регистрация: 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 / 36
Регистрация: 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 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
21.07.2012, 14:55 #4
или std::binary_function
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.07.2012, 16:43 #5
Цитата Сообщение от alex_x_x Посмотреть сообщение
или std::binary_function
Которые устарели.
0
modwind
52 / 52 / 2
Регистрация: 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 / 478
Регистрация: 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
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 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
Эксперт С++
7673 / 5582 / 541
Регистрация: 10.12.2010
Сообщений: 25,044
Записей в блоге: 17
22.07.2012, 02:03 #10
Наверное:
C++
1
l2.remove_if(equal_to<int>(4));
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 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
22.07.2012, 05:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2012, 05:57
Привет! Вот еще темы с решениями:

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

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

STL
Подскажите, какие приорететы использования std, если программа работа программы...

STL
Всем привет :) Задача следующая - Нужно считать из файла строки, запихнуть их...


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

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

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