这是我的问题:我有一堆文件,其名称如“_X1.bla.txt”,“_ X101.bla.txt”,_ X47.bla.txt“我用boost :: filesystem读取添加到std :: vector。
从示例中可以看出,名称不是以数字开头的。在这个例子中,结果应该是1,47,101。如果你告诉我如何从文件中提取数字我应该能够自己自动保存文件。
最佳hu dao
答案 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)',你可以直接使用有序地图。