带数字字符串排序

include "stdafx.h"
#include // std::cout
#include
#include // std::sort, std::copy
#include // std::ostream_iterator
#include // std::istringstream
#include
#include // std::isdigit

bool compareNature(const std::string& a, const std::string& b)
{
    if (a.empty())
        return true;
    if (b.empty())
        return false;
    if (std::isdigit(a[0]) && !std::isdigit(b[0]))
        return true;
    if (!std::isdigit(a[0]) && std::isdigit(b[0]))
        return false;
    if (!std::isdigit(a[0]) && !std::isdigit(b[0]))
    {
        if (std::toupper(a[0]) == std::toupper(b[0]))
            return compareNature(a.substr(1), b.substr(1));
        return (std::toupper(a[0]) < std::toupper(b[0]));
    }

    // Both strings begin with digit --> parse both numbers
    std::istringstream issa(a);
    std::istringstream issb(b);
    int ia, ib;
    issa >> ia;
    issb >> ib;
    if (ia != ib)
        return ia < ib;

    // Numbers are the same --> remove numbers and recurse
    std::string anew, bnew;
    std::getline(issa, anew);
    std::getline(issb, bnew);
    return (compareNature(anew, bnew));
}

int main()
{
    std::vector str;
    str.push_back("1#F1");
    str.push_back("1#2");
    str.push_back("1#3");
    str.push_back("1#F10");
    str.push_back("1#F12");
    str.push_back("1#F15t");
    str.push_back("1#11");

    std::sort(str.begin(), str.end(), compareNature);
    std::copy(str.begin(), str.end(),
        std::ostream_iterator(std::cout, "\n"));

    system("pause");
    return 0;
}

你可能感兴趣的:(C/C++,Qt)