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

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

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

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

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

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

Предикаты 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...

STL - C++
Подскажите, какие приорететы использования std, если программа работа программы в принципе устраивает, за исключением скорости работы? Есть...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
21.07.2012, 14:25     Предикаты в STL #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);
nameless
Эксперт C++
333 / 297 / 14
Регистрация: 16.06.2009
Сообщений: 486
21.07.2012, 14:40     Предикаты в STL #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>());
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
21.07.2012, 14:55     Предикаты в STL #4
или std::binary_function
soon
2538 / 1303 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.07.2012, 16:43     Предикаты в STL #5
Цитата Сообщение от alex_x_x Посмотреть сообщение
или std::binary_function
Которые устарели.
modwind
52 / 52 / 1
Регистрация: 09.03.2012
Сообщений: 101
21.07.2012, 18:01     Предикаты в STL #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;
}
rangerx
1931 / 1540 / 141
Регистрация: 31.05.2009
Сообщений: 2,908
21.07.2012, 20:52     Предикаты в STL #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"));
}
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
21.07.2012, 22:40     Предикаты в STL #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/71b80f...fe40cebaa1c620
Ataman
1 / 1 / 1
Регистрация: 27.10.2011
Сообщений: 33
22.07.2012, 01:01  [ТС]     Предикаты в STL #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
Avazart
7100 / 5277 / 267
Регистрация: 10.12.2010
Сообщений: 23,266
Записей в блоге: 17
22.07.2012, 02:03     Предикаты в STL #10
Наверное:
C++
1
l2.remove_if(equal_to<int>(4));
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2012, 05:57     Предикаты в STL
Еще ссылки по теме:

библиотеки stl - C++
#include &quot;stdafx.h&quot; #include&lt;string&gt; #include&lt;queue&gt; #include&lt;fstream&gt; using namespace std; int main() { queue&lt;char&gt;t,t1; ...

STL. Векторы - C++
Помогите разобрать и исправить ошибку. Я хочу в пустой вектор добавить 100 элементов. и удалить. При этом позиция для вставки и удаления...

Из STL контейнера - C++
Из STL контейнера создать 3-х мерный массив и класс который содержит этот 3-х мерный массив и вывод координат(пользователь вводит...

STL очередь - C++
Доброго времени суток!:) Изучаю STL и решил сделать класс для работы с очередью, и получилось что-то вроде этого... сильно не кричите,...

Проблемы с STL - C++
Задание довольно таки большое. Суть в том, что есть экскурсии(однодневные и многодневные) и нужно всю информацию об этих экскурсиях свести...


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

Или воспользуйтесь поиском по форуму:
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
22.07.2012, 05:57     Предикаты в STL #11
Avazart, Нет.
C++
1
std::bind2nd(std::equal_to<int>(), 4);
http://liveworkspace.org/code/99ad95...84f00fdbc1a5f6
Yandex
Объявления
22.07.2012, 05:57     Предикаты в STL
Ответ Создать тему
Опции темы

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