Как сделать копию Boost :: FileSystem :: Directory_iterator?
-
28-10-2019 - |
Вопрос
Я знаю, что это звучит глупо, но посмотрите на этот простой пример (у рабочего режира должно быть более одного предмета):
#define BOOST_FILESYSTEM_VERSION 3
#include <boost/filesystem.hpp>
#include <cassert>
int main()
{
using namespace boost::filesystem;
directory_iterator it("./");
directory_iterator it_copy = it;
++it;
assert(it_copy != it);
return 0;
}
it_copy
модифицируется вместе с it
! (Ускорение 1.45) Какие соображения могут привести к такой дизайне (directory_iterator
Что -то вроде умного PTR)?
Мне просто нужно сохранить копию directory_iterator
использовать его позже.
Решение
Если вы посмотрите на ссылка Вы заметите, что это рекламируется как boost::single_pass_traversal_tag
.
Это эквивалент (в терминологии повышения) Входной итератор В STL (подумайте об этом как о итераторе, доставляющей пакеты из сетевого соединения, вы не можете перемотать).
Также обратите внимание (с той же страницы):
i == j
не подразумевает, что++i == ++j
.
На этом этапе можно задаться вопросом, почему его можно скопировать. Причина в том, что алгоритмы STL установили норму, принимая свои аргументы с помощью копии. Поэтому это не было бы полезно с помощью алгоритмов STL, если бы его нельзя было скопировать.