C ++ строка сортируется как человек?

Я хотел бы сортировать буквенно-цифровые строки так, как их сортирует человек. То есть, «A2» предшествует «A10», а «a» обязательно предшествует «Z»! Есть ли способ обойтись без написания мини-парсера? В идеале было бы также поставить «A1B1» перед «A1B10». Я вижу вопрос«Естественная (человеческая буквенно-цифровая) сортировка в Microsoft SQL 2005» с возможным ответом, но он использует различные библиотечные функции, как и"Сортировка строк для людей с помощью IComparer".

Ниже приведен тест, который в настоящее время не проходит:

#include <set>
#include <iterator>
#include <iostream>
#include <vector>
#include <cassert>

template <typename T>
struct LexicographicSort {
  inline bool operator() (const T& lhs, const T& rhs) const{
    std::ostringstream s1,s2;
    s1 << toLower(lhs); s2 << toLower(rhs);
    bool less = s1.str() < s2.str();
    //Answer: bool less = doj::alphanum_less<std::string>()(s1.str(), s2.str());
    std::cout<<s1.str()<<" "<<s2.str()<<" "<<less<<"\n";
    return less;
  }

  inline std::string toLower(const std::string& str) const {
    std::string newString("");
    for (std::string::const_iterator charIt = str.begin();
         charIt!=str.end();++charIt) {
          newString.push_back(std::tolower(*charIt));
        }
        return newString;
      }
};


int main(void) {
  const std::string reference[5] = {"ab","B","c1","c2","c10"};
  std::vector<std::string> referenceStrings(&(reference[0]), &(reference[5]));

  //Insert in reverse order so we know they get sorted
  std::set<std::string,LexicographicSort<std::string> > strings(referenceStrings.rbegin(), referenceStrings.rend());

  std::cout<<"Items:\n";
  std::copy(strings.begin(), strings.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
  std::vector<std::string> sortedStrings(strings.begin(), strings.end());
  assert(sortedStrings == referenceStrings);
}

Ответы на вопрос(4)

Ваш ответ на вопрос