Сохранение вектора итераторов данных

у меня есть функция :

void get_good_items(const std::vector<T>& data,std::vector<XXX>& good_items);

эта функция должна проверять все данные и находить элементы, удовлетворяющие условию и возвращать , где они в good_items.

что лучше вместо std::vector<XXX>?

  1. std::vector<size_t>, который содержит все хорошими показателями.
  2. std::vector<T*>, которые содержат указатели на элементы.
  3. std::vector<std::vector<T>::iterator>, который содержит итераторы на элементы.
  4. другой ??

EDIT:

что я буду делать с good_items? Много вещей... один из них-удалить их из вектора и сохранить в другом месте. может быть, что-то еще позже

EDIT 2:

одним из самых важных для меня-как будет доступ к элементы!--6--> будет быстрым в зависимости от структуры good_items?

EDIT 3:

Я только что понял, что моя мысль была неправильной. Не лучше ли сохранить необработанные указатели(или умные) в качестве элементов вектора, чтобы я мог сохранить реальные значения вектора (которые являются указателями), и я не боюсь тяжелой копии, потому что они просто указатели?

4 ответов


Если вы удалите элементы из исходного вектора, каждый из перечисленных методов будет проблемой.

Если вы добавите элементы в исходный вектор, второй и третий будут проблематичными. Первый не будет проблемой, если вы используете push_back добавить элементы.

все они будут в порядке, если вы не измените исходный вектор.

учитывая это, я бы рекомендовал использовать std::vector<size_t>.


Я бы поехал с std::vector<size_t> или std::vector<T*> потому что их легче печатать. В противном случае эти три вектора в значительной степени эквивалентны, все они идентифицируют позиции элементов.

std::vector<size_t> можно использовать меньший тип для индексов, если вы знаете пределы.

если вы ожидаете, что в этом векторе будет много элементов, вам может понравиться использовать boost::dynamic_bitset вместо того, чтобы сохранить память и увеличить использование кэша процессора. Бит на элемент, позиция бита быть индексом в исходный вектор.


Если вы хотите удалить элементы, которые Утоли сказуемое, потом стереть-удалить идиома-это самое простое решение.

Если вы намерены скопировать такие элементы, то std::copy_if самое простое решение.

Если вы собираетесь в конечном итоге с двумя разделами контейнера, т. е. контейнер имеет хороших и другой плохие, то std::partition_copy - хороший выбор.

для общего разрешения итерации таких элементов эффективным решением является возвращает диапазон таких итераторов, которые будут проверять предикат во время итерации. Я не думаю, что в стандартной библиотеке есть такие итераторы, поэтому вам нужно будет реализовать их самостоятельно. К счастью, boost уже сделал это для вас: http://www.boost.org/doc/libs/release/libs/iterator/doc/filter_iterator.html


проблема, которую вы решаете, из моего понимания, является пересечением двух множеств, и я бы пошел на решение из стандартной библиотеки:std:: set_intersection