Я написал очень простую базу данных для управления файлами, которая в основном выглядит так:
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
foo2
fooN
barM
В принципе, я могу найти файл по его имени.
Поскольку моего контейнера нет в памяти, у меня нет указателей на его данные. Итак, моя идея заключалась в том, чтобы сохранить путь к файлу в итераторе. Таким образом, я могу реализовать operator==
со сравнением строк, так как пути должны быть уникальными. Итератор, возвращенный из fileDB.end()
, будет пустой строкой, а operator*
вызовет fileDB::loadFile()
с его путем к файлу.
Больше всего меня беспокоит operator++
. Имея имя файла, я могу узнать содержащий его каталог и найти следующий файл, но это действительно неэффективно. Любые идеи о том, как это сделать? Или я совершенно не прав во всей своей концепции?