我正在使用boost的文件系统和std :: max_element()来查找给定目录中名字最长的文件:
#include <iostream>
#include <iterator>
#include <algorithm>
#include <string>
#include <boost/filesystem.hpp>
using namespace std;
using namespace boost::filesystem;
bool size_comp( directory_entry de1, directory_entry de2 )
{
return de1.path().string().size() < de2.path().string().size();
}
int main(int argc, char* argv[])
{
path p (argv[1]); // p is a path to a directory
directory_iterator itr (p);
directory_iterator itr_end;
directory_iterator itr_max=::max_element(itr,itr_end,size_comp);
int max_size = itr_max->path().string().size();
cout << "Longest file name: " << itr_max->path() << " has "
<< max_size << " characters" << endl;
return 0;
}
对于目录为animals with cat.dat,mouse.dat,elephant.dat的目录,输出为:
Longest file name: Animals/mouse.dat has 17 characters
这既不是最长也不是最短的文件名。上面的代码出了什么问题?
答案 0 :(得分:3)
boost::filesystem::directory_iterator
分享状态。实现声明实现由boost::shared_ptr
管理,以允许InputIterators所需的浅拷贝语义。因此,当算法(例如std::max_element
)迭代[first,last)
时,结果迭代器会以first
的每个增量间接修改,因为迭代器将与{{1}共享状态}。
要解决此问题,请考虑在整个算法中存储boost::filesystem::directory_entry
。例如,可以从first
范围构造std::vector<directory_entry>
,然后将向量传递给directory_iterator
。或者,手动编写算法可能更容易。
这是一个完整的示例,显示了在当前目录下运行的两种方法。
std::max_element
示例运行输出:
[tsansbury@localhost tmp]$ ls file_four file_one file_three file_two [tsansbury@localhost tmp]$ ../a.out "./file_three" "./file_three"