带有boost directory_iterator的Max_element

时间:2013-07-30 12:57:17

标签: c++ boost iterator

我正在使用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

这既不是最长也不是最短的文件名。上面的代码出了什么问题?

1 个答案:

答案 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"