C ++ выбрать из вектора объектов - PullRequest
3 голосов
/ 26 октября 2011

У меня есть класс A со следующим методом члена:

bool A::test();

У меня есть vector<A> v объектов A.Я хотел бы создать новый vector<A> из v, выбирая только те элементы, для которых A :: test () возвращает true.

Какой самый простой и элегантный способ сделать это с использованием STL и boost:: lambda (у меня нет C ++ 11)?

Ответы [ 4 ]

4 голосов
/ 26 октября 2011

Хотя copy_if не входит в более ранний стандарт, вы можете сделать то же самое с remove_copy_if.

И если у вас есть C ++ 11, это тривиально просто:

std::remove_copy_if(
      v.begin(),
      v.end(),
      std::back_inserter(b),
      [] (const A& val) -> bool
      { return val.test(); });

Поскольку у вас нет C ++ 11, все равно легко:

// global free function
bool test_a(const A& a) { return a.test(); }

std::remove_copy_if(
      v.begin(),
      v.end(),
      std::back_inserter(b),
      test_a);
2 голосов
/ 26 октября 2011

Вы можете сделать что-то вроде

std::vector<A>::iterator testFailedIt = std::stable_partition(v.begin(), v.end(), test());
std::copy(v.begin(), testFailedIt, std::back_inserter(newVector));

Если вам не важен относительный порядок элементов, std :: partition тоже может это сделать.

std :: partition/ stable_partition переупорядочивает элементы в последовательности таким образом, чтобы элементы, для которых test () выполнялось, находились в первой части последовательности, а остальные - во второй части последовательности.Возвращает итератор в первую позицию второй группы.

2 голосов
/ 26 октября 2011

Я думаю, вы можете использовать remove_copy_if для этого, что-то вроде std::remove_copy_if(v.begin(), v.end(), std::back_inserter(new_v), pred_that_returns_true_when_A::test()_is_false);

0 голосов
/ 26 октября 2011

Как насчет обратного пути? Сделайте копию первого вектора и используйте remove_if. Вам просто нужно сторнировать возвращаемое значение вашей тестовой функции. Примерно так:

std::vector<A> second_vector(first_vector);
std::erase(std::remove_if(second_vector.begin(), second_vector.end(), test), second_vector.end());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...