4

这是我的问题:我用 boost::filesystem 读入了一堆文件,它们的名称如“_X1.bla.txt”、“_X101.bla.txt”、_X47.bla.txt”并添加到标准::向量。

正如您从示例中看到的,名称不以数字开头。在这个例子中,结果应该是 1、47、101。如果你告诉我如何从文件中提取数字,我应该能够自己对文件进行自动排序。

最好的胡刀

4

3 回答 3

4

如果您在容器中拥有所有名称(例如 std::vector 文件名),您可以这样做

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());
}
于 2013-09-10T16:33:46.750 回答
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() );

于 2013-09-10T17:12:39.630 回答
0

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

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

而不是使用“对向量(int,字符串)”,您可以直接使用有序映射。

于 2013-09-10T16:37:50.073 回答