Вопрос

Я знаю, что это звучит глупо, но посмотрите на этот простой пример (у рабочего режира должно быть более одного предмета):

#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, если бы его нельзя было скопировать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top