они добавляют copy_if в c ++ 0x? - PullRequest
7 голосов
/ 27 апреля 2009

Очень раздражает, что copy_if нет в C ++. Кто-нибудь знает, будет ли это в C ++ 0x?

Ответы [ 3 ]

7 голосов
/ 27 апреля 2009

Поскольку C ++ 0x еще не завершен, вы можете только взглянуть на самый последний draft .

5 голосов
/ 28 апреля 2009

Между тем, не очень сложно сделать свой собственный copy_if(), используя remove_copy_if():

#include <functional>

struct my_predicate : std::unary_function<my_arg_type, bool> {
    bool operator()(my_arg_type const& x) const { ... }
};

// To perform "copy_if(x, y, z, my_predicate())", write:
remove_copy_if(x, y, z, std::not1(my_predicate()));

Использование not1() требует, чтобы ваш класс предикатов предоставлял вложенный тип, argument_type, идентифицирующий тип аргумента - как показано выше, один из удобных способов сделать это - извлечь из unary_function<T, U>, где T тип аргумента.

4 голосов
/ 10 мая 2014

Просто для полноты, в случае, если кто-то гуглит свой путь к этому вопросу, следует отметить, что сейчас (в C ++ 11 и более поздних версиях) есть a копия если алгоритм. Он ведет себя как ожидалось (копирует элементы в диапазоне, для которого один предикат возвращает true, в другой диапазон).

Типичный вариант использования будет

std::vector<int> foo{ 25, 15, 5, -5, -15 };
std::vector<int> bar;

// copy only positive numbers:
auto it = std::copy_if (foo.begin(), foo.end(), std::back_inserter(bar), 
            [](int i){return !(i<0);
          });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...