Использование remove_copy_if

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Аватара пользователя
Monopo
Сообщения: 125
Зарегистрирован: 06 дек 2007, 20:08
Откуда: Linux

Столкнулся с необходимостью копировать из контейнера в контейнер элементов, удовлетворяющих заданному условию.

Код: Выделить всё

class Trial //абстрактный класс
{
        /...
};

class Test: virtual public Trial
{
        //...
        protected:
        string Name;
};

class Exam: virtual public Trial
{
        //...
        protected:
        string Name;
};

class OutExam: virtual public Exam
{
        //...
        protected:
        string Name;
};

typedef list<Trial*> TList;
typedef deque<Trial*> TDeque;

//-----------------------------------------------------------------------

        TList Lcon; // то, откуда нужно копировать
        TList::iterator Lit=Lcon.begin();
	TDeque Deqcon; //то, куда нужно копировать
	TDeque::iterator Deqit=Deqcon.begin();
Условием может быть, например, совпадение поля Name с какой-то строкой str. В указании к заданию сказано, что должна использоваться функция remove_copy_if(). Перечитал немало литературы по контейнерам, но теоретический материал так и не удовлетворил мою потребность)) Скажите, пожалуйста, как воспользоваться этой функцией? Сколько параметров она должна иметь, и за что каждый из них отвечает?
Юный Падаван
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

А MSDN не помогла?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Fake
Fake
Fake
Fake
Fake
Fake
Fake
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Monopo
Сообщения: 125
Зарегистрирован: 06 дек 2007, 20:08
Откуда: Linux

Ошибки у меня в предикате, как бы я его коряво не писал(
Юный Падаван
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Ну так выкладывай код, будем разбираться.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Monopo
Сообщения: 125
Зарегистрирован: 06 дек 2007, 20:08
Откуда: Linux

Я не понимаю, как я могу подобраться к полю Name, если нужно проверить поле каждого объекта в списке. Если бы копирование шло в цикле, тогда просто бегунком по каждому. А тут все одной строчкой)) Я пока, конечно, байду написал:

Код: Выделить всё

#include "trials.h"

bool Ifm(Trial* obj)
{
    if((obj)->RetName()=="Matematika")return true; //RetName() метод класса, возвращающий значение Name
    else return false;
}
И потоп вызываю вот это:

Код: Выделить всё

remove_copy_if(Lcon.begin(),Lcon.end(),back_inserter(Deqcon),Ifm);
Тем самым удаляю все "Matematika" и получаю новый список. А как сделать так, чтоб пользователь вместо "Matematika" сам что-нибудь ввел, не понимаю. Пробовал писать bool-функцию с двумя параметрами, но опять же не понял, как их там два штуки совместить.
Юный Падаван
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Предикат, это не только функция. Это любой тип, у которого определён оператор (), например вот такой класс тоже является предикатом.

Код: Выделить всё

class Ifm
{
public:
    Ifm(const std::string& strName) : m_strName(strName) {}

    bool operator () (const Trial* obj)
    {
        return (obj->RetName() == m_strName);
    }

private:
    std::string m_strName;
}

void main()
{
    Ifm ifm("Matematika");
    remove_copy_if(Lcon.begin(), Lcon.end(), back_inserter(Deqcon), ifm);
}
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить