boost::filesystem::directory_iterator
股份状态。实现声明实现由管理实现boost::shared_ptr
以允许 InputIterators 所需的浅拷贝语义。因此,当一个算法(例如std::max_element
)迭代 时[first,last)
,结果迭代器会随着 的每个增量而间接修改first
,因为结果迭代器将与 共享状态first
。
要解决此问题,请考虑boost::filesystem::directory_entry
在整个算法中存储。例如,可以std::vector<directory_entry>
从一个directory_iterator
范围构造 a ,然后将向量传递给std::max_element
。或者,手动编写算法可能更容易。
这是一个完整的示例,显示了在当前目录上运行的两种方法。
#include <algorithm> // std::copy, std::max_element
#include <iterator> // std::back_inserter
#include <iostream> // std::cout, std::endl
#include <vector>
#include <utility> // std::make_pair
#include <boost/filesystem.hpp>
#include <boost/foreach.hpp>
namespace fs = boost::filesystem;
bool size_comp(const fs::directory_entry& lhs,
const fs::directory_entry& rhs)
{
return lhs.path().string().size() < rhs.path().string().size();
}
/// @brief Finds max by copying all directory entries.
fs::directory_entry max_full_copy(
fs::directory_iterator first,
fs::directory_iterator last)
{
// Extract directory_entries from directory_iteartor.
std::vector<fs::directory_entry> entries;
std::copy(first, last, std::back_inserter(entries));
// Find max element.
return *std::max_element(entries.begin(), entries.end(), &size_comp);
}
/// @brief Finds max by only storing a copy of the max entry.
fs::directory_entry max_single_copy(
fs::directory_iterator first,
fs::directory_iterator last)
{
fs::directory_entry result;
BOOST_FOREACH(fs::directory_entry& current, std::make_pair(first, last))
{
if (size_comp(result, current))
result = current;
}
return result;
}
int main()
{
std::cout << max_full_copy(fs::directory_iterator("."),
fs::directory_iterator()) << "\n"
<< max_single_copy(fs::directory_iterator("."),
fs::directory_iterator()) << std::endl;
}
一个带有输出的示例:
[tsansbury@localhost tmp]$ ls
文件_四个文件_一个文件_三个文件_两个
[tsansbury@localhost tmp]$ ../a.out
“./file_three”
“./file_three”