集成多态可扩展排序顺序

时间:2018-03-25 13:07:31

标签: c++ sorting c++11 polymorphism

假设我有一个基类B和两个派生类CD

如果我将CD的对象放在向量中,我可以按类型对向量进行排序,方法是重载lessThan运算符以获取两个类型为B的对象并执行必要的操作比较在那里。例如,我可以为每个类提供一个排序ID,并将其进行比较以确定C是否在D之前,反之亦然。 现在我们假设排序顺序是C< D。 假设我希望能够添加任意数量的派生类。现在虽然它仍然存在,C< D,但现在可能需要E< C< {{1} E }}

因此,当我添加新的课程D时,如何实现这样的可扩展排序顺序,而无需更改CD

1 个答案:

答案 0 :(得分:1)

不完全是你问的问题,但是...如何在向量中添加一个带有排序ID和B的对?

我的意思是......如果您为排序ID定义enum

enum idClass { isB, isC, isD };

和用于缩短代码的类型

using pib = std::pair<idClass, B>;

您可以按如下方式定义矢量

std::vector<pib> vpb;

添加记住正确ID的元素

vpb.emplace_back(isC, C{});
vpb.emplace_back(isD, D{});

并使用简单的lambda进行排序

std::sort(vpb.begin(), vpb.end(), [](pib const & p1, pib const & p2)
          { return p1.first < p2.first; });

当您添加其他课程E时,您只需在isE枚举中添加idClass ID(在您喜欢的位置),而无需修改{{ 1}},BC

以下是一个完整的工作示例

D