Как реализовать пользовательскую реализацию стандартного итератора?

Я написал очень простую базу данных для управления файлами, которая в основном выглядит так:

class FileDB
{
public:
    FileDB(std::string dir) : rootDir(dir) { }

    void loadFile(std::string filename, File &file) const;
    void saveFile(std::string filename, const File &file) const;

private:
    std::string rootDir;
}

Теперь я хотел бы выполнить итерацию по всем файлам, содержащимся в базе данных, например, с помощью std::iterator:

void iterateFiles()
{
    FileDB filedb("C:\\MyFiles");

    for (FileDB::iterator file_it = filedb.begin(); file_it != filedb.end(); ++file_it)
    {
        File f = *file_it;
        // do something with file
    }
}

Я читал ответы на подобные вопросы, некоторые предлагают получить std: :iterator, некоторые используют std::iterator_traits, но я не очень понимаю, как это сделать. Что может пойти не так при попытке реализовать собственный итератор? элегантный способ сделать это?

РЕДАКТИРОВАТЬ: Пожалуйста, не рассматривайте возможность использования boost, мой вопрос носит более концептуальный характер.

РЕДАКТИРОВАТЬ 2:

FileDB работает следующим образом:

  • rootDir

    • foo1
      • бар1
        • foo1bar1_1.txt
        • foo1bar1_2.текст
      • бар2
        • foo1bar2_1.txt
        • foo1bar2_2.txt
    • foo2

    • fooN

      • barM

        • fooNBarM_x.txt

В принципе, я могу найти файл по его имени.

Поскольку моего контейнера нет в памяти, у меня нет указателей на его данные. Итак, моя идея заключалась в том, чтобы сохранить путь к файлу в итераторе. Таким образом, я могу реализовать operator==со сравнением строк, так как пути должны быть уникальными. Итератор, возвращенный из fileDB.end(), будет пустой строкой, а operator*вызовет fileDB::loadFile()с его путем к файлу.

Больше всего меня беспокоит operator++. Имея имя файла, я могу узнать содержащий его каталог и найти следующий файл, но это действительно неэффективно. Любые идеи о том, как это сделать? Или я совершенно не прав во всей своей концепции?

8
задан Ben 30 March 2012 в 17:10
поделиться