字符串排序

#include <iostream>
#include <thread>
#include <regex>
#include <string>
#include <algorithm>

#include <absl/strings/match.h>

#include <atlstr.h>

struct NumberStringCompare
{
    bool operator()(const std::string& a, const std::string& b)
    {
        auto split_str = [](const std::string& complex, std::string& prefix, std::string& suffix, bool is_num) -> void {
            const static std::regex r_get_number(R"([\D])");
            const static std::regex r_get_neg_number(R"([\d])");

            const std::regex& reg = is_num ? r_get_number : r_get_neg_number;

            std::cmatch m;
            if (std::regex_search(complex.c_str(), m, reg))
            {
                prefix = m.prefix();
                suffix = m.str() + m.suffix().str();
            }
            else
            {
                prefix = complex;
                suffix = "";
            }
        };

        std::string pa, pb, sa(a), sb(b);
        while (!sa.empty()||!sb.empty())
        {
            split_str(sa, pa, sa, true);
            split_str(sb, pb, sb, true);

            if (pa != pb)
            {
                if (pa.empty()) return sa.empty();
                if (pb.empty()) return !sb.empty();

                if (pa.size() != pb.size())
                {
                    std::string& p = pa.size() < pb.size() ? pa : pb;
                    for (decltype(p.size()) i = 0; i < std::abs((long long)(pa.size() - pb.size())); ++i)
                        p = "0" + p;
                }

                if (pa != pb)
                    return pa < pb;
            }

            split_str(sa, pa, sa, false);
            split_str(sb, pb, sb, false);

            CStringA str_pa(pa.c_str());
            auto ret = str_pa.CompareNoCase(pb.c_str());
            if (ret != 0)
                return ret < 0;
        }

        return true;
    }
};

int main()
{
    std::vector<std::string> strs({ "abc","ABCD","3","2", "AB","abcde", "10", "01", "abc10", "abc2" });
    std::sort(strs.begin(), strs.end(), NumberStringCompare());
    std::sort(strs.rbegin(), strs.rend(), NumberStringCompare());

    OutputDebugStringA("");
}
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值