Du kannst die Rekusion verbessern, indem du ganz auf sie verzichtest!
Code:
#include <iostream>
#include <vector>
#include <algorithm>
#include <filesystem>
namespace sys = std::tr2::sys;
std::vector<sys::path> getEmptyDirectories(const sys::path& in)
{
std::vector<sys::path> directories;
if (!sys::exists(in))
return directories;
sys::directory_iterator begin(in);
sys::directory_iterator end;
std::for_each(begin, end, [&](sys::directory_entry directoryEntry)
{
auto path = directoryEntry.path();
if (sys::is_directory(path) && sys::is_empty(path))
directories.push_back(path);
});
return directories;
}
int main()
{
auto directories = getEmptyDirectories(sys::current_path<sys::path>());
std::cout << "Directories:\n";
std::copy(directories.begin(), directories.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
std::cin.get();
return 0;
}
Benötigt derzeit noch Visual Studio 2013, aber das wird noch dieses Jahr Standard, wodurch das dann später auch mit dem GCC laufen wird.
Das hier hat folgende Vorteile:
-Keine Rekursion
-Plattformübergreifend
-Lesbarer & Kürzer (dadurch wartbarer)
-Robuster durch strong exception safety
-Mehr Buzzwörter die mir gerade nicht einfallen