gpt4 book ai didi

c++ - 集成多态可扩展排序顺序

转载 作者:行者123 更新时间:2023-11-28 04:44:40 26 4
gpt4 key购买 nike

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

如果我将 CD 的对象放在一个 vector 中,我可以通过重载 lessThan 运算符来按类型对 vector 进行排序,以获取两个 类型的对象B 并在其中进行必要的比较。例如,我可以给每个类一个排序 ID 并比较它以确定 C 是否在 D 之前,反之亦然。现在假设排序顺序是 C<D。假设我希望能够添加任意数量的派生类。现在虽然 C<D 仍然成立,但现在可能有一个类 E 需要 C<E<D.

因此,当我添加新类 E?

最佳答案

不完全是你问的,但是......将一对带有排序 ID 和 B 的 vector 放入怎么样?

我的意思是...如果您定义一个 enum 来对 ID 进行排序

enum idClass { isB, isC, isD };

和一种用来缩短代码的类型

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

你可以如下定义 vector

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 时,你只需在 idClass 枚举中添加一个 isE ID(在你喜欢的位置)无需修改BCD

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

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

struct B { };
struct C : public B { };
struct D : public B { };

enum idClass { isB, isC, isD };

int main ()
{
using pib = std::pair<idClass, B>;

std::vector<pib> vpb;

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


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

for ( auto const & p : vpb )
std::cout << "- " << p.first << std::endl;
}

关于c++ - 集成多态可扩展排序顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49476184/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com