这是我的问题:我用 boost::filesystem 读入了一堆文件,它们的名称如“_X1.bla.txt”、“_X101.bla.txt”、_X47.bla.txt”并添加到标准::向量。
正如您从示例中看到的,名称不以数字开头。在这个例子中,结果应该是 1、47、101。如果你告诉我如何从文件中提取数字,我应该能够自己对文件进行自动排序。
最好的胡刀
如果您在容器中拥有所有名称(例如 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());
}
您可以使用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() );
假设您使用了 boost 文件系统 directory_iterator。使用迭代器,您可以将文件名作为字符串访问。
使用正则表达式 (\d+) 提取数字(如果多个)
而不是使用“对向量(int,字符串)”,您可以直接使用有序映射。