【CPP】自定义排序--针对智能指针
目录
- 代码块
代码块
#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");
}