【CPP】自定义排序--针对智能指针

发布时间 2023-04-27 23:43:43作者: 霍格沃兹在逃麻瓜

目录

代码块

#include <iostream>
#include <memory>
#include <vector>
#include <algorithm>

using namespace std;

class Base
{
public:
    virtual void Print() { std::cout << "I am Base!\n"; }
};

class Derived1: public Base
{
public:
    void Print() override { std::cout << "I am Derived1!\n";};
};

class Derived2: public Derived1
{
public:
    void Print() override { std::cout << "I am Derived2!\n";};
};

using SpBase = std::shared_ptr<Base>;
using VecSpBase = std::vector<std::shared_ptr<Base>>;

bool Cmp(const SpBase& a, const SpBase& b)
{
    auto SwitchOrder = [](const SpBase& elem) -> int {
        if (dynamic_cast<Derived2*>(elem.get())) {
            return 1;
        } else if (dynamic_cast<Derived1*>(elem.get())) {
            return 2;
        } else {
            return 3;
        }
    };
    return SwitchOrder(a) < SwitchOrder(b);
}

int main()
{
    SpBase base1 = make_shared<Base>();
    SpBase base2 = make_shared<Base>();
    SpBase derived11 = make_shared<Derived1>();
    SpBase derived12 = make_shared<Derived1>();
    SpBase derived21 = make_shared<Derived2>();
    SpBase derived22 = make_shared<Derived2>();
    VecSpBase vec = {base1, base2, derived11, derived12, derived21, derived22};
    auto Print = [&vec](std::string_view const rem)
    {
        cout << rem << endl;
        for (auto item : vec) {
            cout << item.get() << ",";
        }
        printf("\n");
    };
    Print("before:");
    std::sort(vec.begin(), vec.end(), Cmp);
    Print("after");
}