Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/48: Рейтинг темы: голосов - 48, средняя оценка - 4.67
 Аватар для Ataman
1 / 2 / 1
Регистрация: 27.10.2011
Сообщений: 33

Предикаты в STL

21.07.2012, 14:02. Показов 9705. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, не могу понять что должна принимать функция в качестве унарного предиката или бинарного. Вот допустим контейнер LIST, можете привести маленький пример пожалуйста?
Миниатюры
Предикаты в STL  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.07.2012, 14:02
Ответы с готовыми решениями:

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

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

Встроенные предикаты. Предикаты взаимодействия, размещение данных
Есть три вопроса: С равенством разобрался, вроде ничего сложного. Про предикаты нашел много инфы, но про предикаты взаимодействия и...

17
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
21.07.2012, 14:25
принимает элемент типа листа 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
342 / 306 / 36
Регистрация: 16.06.2009
Сообщений: 486
21.07.2012, 14:40
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
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
21.07.2012, 14:55
или std::binary_function
0
 Аватар для soon
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.07.2012, 16:43
Цитата Сообщение от alex_x_x Посмотреть сообщение
или std::binary_function
Которые устарели.
0
 Аватар для modwind
52 / 52 / 2
Регистрация: 09.03.2012
Сообщений: 101
21.07.2012, 18:01
Предикат - это нечто, похожее на функцию и возвращающее 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
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
21.07.2012, 20:52
Цитата Сообщение от 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
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.07.2012, 22:40
Оставляет в контейнере только нечетные члены. С++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/... cebaa1c620
1
 Аватар для Ataman
1 / 2 / 1
Регистрация: 27.10.2011
Сообщений: 33
22.07.2012, 01:01  [ТС]
спасибо большое

Добавлено через 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
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.07.2012, 02:03
Наверное:
C++
1
l2.remove_if(equal_to<int>(4));
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
22.07.2012, 05:57
Avazart, Нет.
C++
1
std::bind2nd(std::equal_to<int>(), 4);
http://liveworkspace.org/code/... 0fdbc1a5f6
1
0 / 0 / 0
Регистрация: 26.01.2023
Сообщений: 13
13.02.2023, 19:11
Добрый вечер.

Такой вот предикат:
C++
1
2
3
4
5
6
template<typename A0, typename A1 >
struct is_bool{
    bool operator()(const A0 & val0, const A1 & val1 ) const {
        return (val0 & val1);
    }
};
Необходимо просто сравнить два числа. Каков синтаксис применения этого предиката.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.02.2023, 19:13
Цитата Сообщение от Tennessine Посмотреть сообщение
Необходимо просто сравнить два числа
Сравнить на что ?
0
0 / 0 / 0
Регистрация: 26.01.2023
Сообщений: 13
13.02.2023, 20:34
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class compare_class {
    public:
    bool operator()(int A, int B) {
        return (A < B);
    }
};
 
int main(void){
    
lcd.begin(20, 4);
lcd.setCursor(0, 0);
 
compare_class cc;
 
bool b = cc(15,9);
 
(void)(b);
 
lcd.print(b);
 
    while (1) {  }
}
вывод->
Пока не не забыл. Предикат это функция(пародия на функцию) с отложенным вычислением, возвращающая логическое значение. Создаем экземпляр, потом в нужном месте в нужное время приделываем круглые скобки с параметрами. Как-то так?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12942 / 6809 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
13.02.2023, 20:47
Цитата Сообщение от Tennessine Посмотреть сообщение
bool operator()(int A, int B) {
        return (A < B);
    }
И? Как это отвечает на вопрос о предикате из сообщения №12?

Цитата Сообщение от Tennessine Посмотреть сообщение
Пока не не забыл. Предикат это функция(пародия на функцию) с отложенным вычислением
Что в данном случае значит "с отложенным вычислением"?

Цитата Сообщение от Tennessine Посмотреть сообщение
Создаем экземпляр, потом в нужном месте в нужное время приделываем круглые скобки с параметрами
Предикат не обязан быть функциональным объектом. Можно использовать и обычную функцию. Тогда не надо "создаем экземпляр".
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
13.02.2023, 20:50
Цитата Сообщение от Tennessine Посмотреть сообщение
Предикат это функция(пародия на функцию)
Функциональный объект или функтор.

Цитата Сообщение от Tennessine Посмотреть сообщение
с отложенным вычислением
С каким еще отложенным ?

Ничего не нужно откладывать, например :
C++
1
2
3
lcd.print(сс(15,9));
// или
lcd.print(compare_class()(15,9));
0
0 / 0 / 0
Регистрация: 26.01.2023
Сообщений: 13
13.02.2023, 22:14
Мне как бы нужна Compile-time проверка
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
enum com{ com0, com1, com2, com3, com4 };
 
template <com c, int n>
class compare_class {
    public:
    bool operator()() { return (c < n); }
};
 
int main(void){
    
lcd.begin(20, 4);
lcd.setCursor(0, 0);
 
compare_class<com0,5> cc;
 
bool b = cc();
 
lcd.print(b);
 
    while (1) {  }
}
Вроде бы фурычит. Пример тестовый.
0
13.02.2023, 22:24

Не по теме:

Цитата Сообщение от Tennessine Посмотреть сообщение
Мне как бы нужна Compile-time проверка
сезон размножения троллей ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.02.2023, 22:24
Помогаю со студенческими работами здесь

Предикаты
На множестве A= {1, 2, 3, ... 20 } заданы предикаты: A(x): x- не делится на 5; B(x): x- число четное; C(x): x- число простое; ...

Предикаты
А Предикаты i (i=1,2,3,4) равносильны: 1. X в квадрате-4x+4=0 и x-2=0, x принадлежит R 2.(х-5)*(х в квадрате+ 1) = 2х- 10 и х в...

Предикаты
Помогите пожалуйста определить значение высказываний

Предикаты
Прошу помочь с тремя заданиями...

Предикаты
Представить приведенные ниже утверждения в виде нескольких правил. Ввести правила в БД и создать запрос. You are eligible for social...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru