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

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

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

C++ STL
C++ STL
C++ STL
C++ STL
C++ Магический квадрат, предикаты
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OstapBender
 Аватар для OstapBender
581 / 519 / 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++
 Аватар для nameless
289 / 288 / 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
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
21.07.2012, 14:55     Предикаты в STL #4
или std::binary_function
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
21.07.2012, 16:43     Предикаты в STL #5
Цитата Сообщение от alex_x_x Посмотреть сообщение
или std::binary_function
Которые устарели.
modwind
 Аватар для 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
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
 Аватар для 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
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,578
Записей в блоге: 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
Еще ссылки по теме:

Предикаты. Выборка объектов из вектора по определённому полю C++
C++ STL
STL функторы, предикаты C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
Ответ Создать тему
Опции темы

Текущее время: 19:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru