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

Удаление элементов из vector; bind или not1 - C++

Восстановить пароль Регистрация
 
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
07.08.2013, 17:31     Удаление элементов из vector; bind или not1 #1
Как правильно забиндить, - сделать аналог, как через лямбду. Или же тут больше подойдет использование not1 (или not2). Не могу сам разобраться. Вот код:
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
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
 
class A
{
    std::string m_ext;
public:
    A(const char* e) : m_ext(e) {}
    std::string extension() const {return m_ext;}
    void print() const {std::cout << m_ext << std::endl;}
};
 
using namespace std::placeholders;
 
int main()
{
    std::vector<A> v {"txt", "txt", "pro", "pro", "jpg"};
    for (auto& a : v) a.print();
    
    //в векторе должны остаться только объекты с именем "pro"
    //v.erase(std::remove_if( v.begin(), v.end(), [](const A& a){return a.extension() != "pro";}), v.end());
    v.erase(std::remove_if( v.begin(), v.end(), std::bind(&A::extension, std::not_equal_to<A>, _1, _2, "pro") ), v.end());
    //v.erase(std::remove_if( v.begin(), v.end(), std::not1(std::mem_fn(&A::extension), _1, "pro") ), v.end());
    
    std::cout << std::endl;
    for (auto& a : v) a.print();
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2013, 17:31     Удаление элементов из vector; bind или not1
Посмотрите здесь:

C++ Удаление элемента из vector
Удаление элементов из std::vector C++
Использование отрицателя not1 C++
Удаление элемента из vector C++
Удаление первых n элементов из vector C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
07.08.2013, 17:59     Удаление элементов из vector; bind или not1 #2
Непростая конструкция получилась, прямо-таки иллюстация пользы лямбд:
C++
1
2
3
4
v.erase( std::remove_if( v.begin(),
                         v.end(),
                         std::bind( std::not_equal_to< std::string >(), std::bind( &A::extension, _1), "pro" ) ),
         v.end() );
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
07.08.2013, 18:13     Удаление элементов из vector; bind или not1 #3
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
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
 
class A
{
    std::string m_ext;
public:
    A(const char* e) : m_ext(e) {}
    std::string extension() const {return m_ext;}
    void print() const {std::cout << m_ext << std::endl;}
    operator std::string() { return extension(); }
};
 
using namespace std::placeholders;
 
int main()
{
    std::vector<A> v {"txt", "txt", "pro", "pro", "jpg"};
    for (auto& a : v) a.print();
    v.erase(std::remove_if( v.begin(), v.end(), std::bind(std::not_equal_to<std::string>(), _1, "pro")), v.end());
    std::cout << std::endl;
    for (auto& a : v) a.print();
 
    return 0;
}
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
07.08.2013, 18:24  [ТС]     Удаление элементов из vector; bind или not1 #4
Цитата Сообщение от Olivеr Посмотреть сообщение
operator std::string()
А это перегрузка чего?
Olivеr
 Аватар для Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
07.08.2013, 18:24     Удаление элементов из vector; bind или not1 #5
DiffEreD, приведение типа A к типу std::string
Yandex
Объявления
07.08.2013, 18:24     Удаление элементов из vector; bind или not1
Ответ Создать тему
Опции темы

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