• 字符串排序


    #include
    #include
    #include
    #include
    #include

    #include

    #include

    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 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("");
    }
     

  • 相关阅读:
    leetcode每日一题复盘(11.6~11.12)
    (Python) 在Python中对WAV音频文件进行分割与拼接
    JavaWeb---HTML
    Java之IO打印流
    想进入社交电商,但却害怕投入回本无望?来试一试这样做
    【web开发】3、Bootstrap基础
    springBoot 属性绑定
    比例运算放大电路为什么要加平衡电阻
    16结构型模式-组合模式
    MySQL备份与恢复
  • 原文地址:https://blog.csdn.net/syb198810/article/details/127107805