#include <vector>
#include <algorithm>
#include <iostream>
#include <cctype>
#include <string>
struct Comp{
auto get_num (const std::string& a)
{
auto it1 = std::find_if( a.begin(), a.end(), ::isdigit );
auto it2 = std::find_if( a.begin(), a.end(), [](char x){ return x == '.' ;}) ;
/* Do some checks here for std::string::npos*/
auto pos1 = std::distance( a.begin(), it1) ;
auto pos2 = std::distance( it1, it2) ;
return std::stoi (a.substr( pos1, pos2 )) ;
}
bool operator () (const std::string& a, const std::string& b)
{
return get_num (a) < get_num (b) ;
}
};
int main ()
{
std::vector <std::string> vec {
"some_name_10.xyz",
"some_name_1.xyz",
"some_name_2.xyz",
"some_name_12.xyz",
"some_name_3.xyz"
};
std::sort( vec.begin() , vec.end(), Comp());
for(auto x: vec)
std::cout << x << std::endl;
}
CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGNjdHlwZT4KI2luY2x1ZGUgPHN0cmluZz4KCnN0cnVjdCBDb21wewoKICAgIGF1dG8gZ2V0X251bSAoY29uc3Qgc3RkOjpzdHJpbmcmIGEpCiAgICB7CiAgICAgICAgYXV0byBpdDEgPSBzdGQ6OmZpbmRfaWYoIGEuYmVnaW4oKSwgYS5lbmQoKSwgOjppc2RpZ2l0ICk7CiAgICAgICAgYXV0byBpdDIgPSBzdGQ6OmZpbmRfaWYoIGEuYmVnaW4oKSwgYS5lbmQoKSwgW10oY2hhciB4KXsgcmV0dXJuIHggPT0gJy4nIDt9KSA7CiAgICAgICAgLyogRG8gc29tZSBjaGVja3MgaGVyZSBmb3Igc3RkOjpzdHJpbmc6Om5wb3MqLwogICAgICAgIGF1dG8gcG9zMSA9IHN0ZDo6ZGlzdGFuY2UoICBhLmJlZ2luKCksIGl0MSkgOwogICAgICAgIGF1dG8gcG9zMiA9IHN0ZDo6ZGlzdGFuY2UoICBpdDEsIGl0MikgOwogICAgICAgIHJldHVybiBzdGQ6OnN0b2kgKGEuc3Vic3RyKCBwb3MxLCBwb3MyICkpIDsKICAgIH0KCiAgICBib29sIG9wZXJhdG9yICgpIChjb25zdCBzdGQ6OnN0cmluZyYgYSwgY29uc3Qgc3RkOjpzdHJpbmcmIGIpICAKICAgIHsKICAgICAgICByZXR1cm4gIGdldF9udW0gKGEpIDwgZ2V0X251bSAoYikgOwogICAgfQoKfTsKCgppbnQgbWFpbiAoKQp7CgogICAgc3RkOjp2ZWN0b3IgPHN0ZDo6c3RyaW5nPiB2ZWMgewogICAgInNvbWVfbmFtZV8xMC54eXoiLAogICAgInNvbWVfbmFtZV8xLnh5eiIsCiAgICAic29tZV9uYW1lXzIueHl6IiwKICAgICJzb21lX25hbWVfMTIueHl6IiwKICAgICJzb21lX25hbWVfMy54eXoiCiAgICB9OwoKICAgc3RkOjpzb3J0KCB2ZWMuYmVnaW4oKSAsIHZlYy5lbmQoKSwgQ29tcCgpKTsKCiAgIGZvcihhdXRvIHg6IHZlYykKCSBzdGQ6OmNvdXQgPDwgeCA8PCBzdGQ6OmVuZGw7Cgp9