使用boost文件系统对文件进行排序

时间:2013-09-10 16:12:15

标签: c++ sorting boost

这是我的问题:我有一堆文件,其名称如“_X1.bla.txt”,“_ X101.bla.txt”,_ X47.bla.txt“我用boost :: filesystem读取添加到std :: vector。

从示例中可以看出,名称不是以数字开头的。在这个例子中,结果应该是1,47,101。如果你告诉我如何从文件中提取数字我应该能够自己自动保存文件。

最佳

hu dao

3 个答案:

答案 0 :(得分:3)

您可以使用boost::regex将数字提取为字符串,在std::sort的自定义比较器中将字符串转换为数字,以对文件的std::vector进行排序

boost::regex re("(\\d+)");
boost::match_results<std::string::const_iterator> what1,what2;

template <typename T>
T st2num ( const std::string &Text )
{
     std::stringstream ss(Text);
     T result;
     return ss >> result ? result : 0;
}
struct mysort
{
    bool operator ()(const std::string & a,const std::string & b) 
    {

    boost::regex_search(a.cbegin(), a.cend(), what1, re,
                           boost::match_default);
    boost::regex_search(b.cbegin(), b.cend(), what2, re,
                           boost::match_default);

    return st2num<int>(what1[1]) < st2num<int>(what2[1]);

    }
};

然后,

//std::vector<std::string> vec{"_X1.bla.txt", "_X101.bla.txt", "_X47.bla.txt"}; std::sort( vec.begin() , vec.end() ,mysort() );

答案 1 :(得分:2)

如果你有一个容器中的所有名字(比如std :: vector filenames)你可以做

std::sort(filenames.begin(),filenames.end()) 

它将使用默认排序功能。如果您想要自定义的,您可以这样做:

struct sort_functor
{
    bool operator ()(const std::string & a,const std::string & b)
    {
        return a < b;// or some custom code
    }
};
void test()
{
    std::vector<std::string> filenames;
    std::sort(filenames.begin(),filenames.end(),sort_functor());
}

答案 2 :(得分:0)

假设您使用了boost filesystem directory_iterator。使用迭代器,您可以将文件名作为字符串访问。

使用正则表达式(\ d +)提取数字(如果多于一个)

而不是使用'vector of pair(int,string)',你可以直接使用有序地图。