Вы можете использовать std::remove_copy_if
вместе с итератором обратной вставки для std::vector<MyObject*>
. Так это будет выглядеть (где TESTFUNCTION - ваша функция, которая принимает тип MyObject*
и возвращает bool
):
std::vector<MyObject*> original;
std::vector<MyObject*> partion_A;
std::back_insert_iterator<std::vector<MyObject*> > inserter_A(partion_A);
std::remove_copy_if(original.begin(), original.end(), inserter_A, TESTFUNCTION);
Теперь partition_A
будет содержать все значения, для которых TESTFUNCTION имеет значение true. Если вам нужен второй вектор разбиения partion_B
, просто создайте еще один TESTFUNCTION_B, который проверяет противоположное условие, а также другой задний вставщик inserter_B
, инициализированный значением partion_B
.
Два преимущества этого метода по сравнению с std::partition
заключаются в том, что 1) он не изменяет исходный вектор, поэтому вероятнее всего будет больше сценариев его использования (т. Е. Ситуации с постоянными итераторами), и 2) его можно запустить на контейнерах, в которых нет двунаправленных итераторов, таких как std::list
и т. д.