Сохранение вектора итераторов данных
у меня есть функция :
void get_good_items(const std::vector<T>& data,std::vector<XXX>& good_items);
эта функция должна проверять все данные и находить элементы, удовлетворяющие условию и возвращать , где они в good_items.
что лучше вместо std::vector<XXX>
?
-
std::vector<size_t>
, который содержит все хорошими показателями. -
std::vector<T*>
, которые содержат указатели на элементы. -
std::vector<std::vector<T>::iterator>
, который содержит итераторы на элементы. - другой ??
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