gpt4 book ai didi

c++ - 对指针列表进行排序

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:12:14 24 4
gpt4 key购买 nike

我又一次发现自己在使用 C++ 完成一些非常简单的任务时失败了。有时我希望我可以从 Java 中的 OO 中学习我所知道的一切,因为我的问题通常是从像 Java 一样思考开始的。

无论如何,我有一个std::list<BaseObject*>我想排序。假设BaseObject是:

class BaseObject {
protected:
int id;
public:
BaseObject(int i) : id(i) {};
virtual ~BaseObject() {};
};

我可以对指向 BaseObject 的指针列表进行排序带有比较器结构:

struct Comparator {
bool operator()(const BaseObject* o1, const BaseObject* o2) const {
return o1->id < o2->id;
}
};

它看起来像这样:

std::list<BaseObject*> mylist;
mylist.push_back(new BaseObject(1));
mylist.push_back(new BaseObject(2));
// ...

mylist.sort(Comparator());

// intentionally omitted deletes and exception handling

到这里为止,一切正常。但是,我引入了一些派生类:

class Child : public BaseObject {
protected:
int var;
public:
Child(int id1, int n) : BaseObject(id1), var(n) {};
virtual ~Child() {};
};

class GrandChild : public Child {
public:
GrandChild(int id1, int n) : Child(id1,n) {};
virtual ~GrandChild() {};
};

所以现在我想按照以下规则进行排序:

  1. 对于任何Child对象 cBaseObject b , b<c
  2. 比较BaseObject对象,使用它的 id s,和以前一样。
  3. 比较Child对象,比较它的 var秒。如果它们相等,则退回到规则 2。
  4. GrandChild对象应回退到 Child行为(规则 3)。

我最初认为我可以在 Comparator 中做一些转换.然而,这抛弃了常量。然后我想也许我可以比较typeid s,但后来一切看起来都很乱,甚至都不正确。

我如何实现这种排序,仍然使用 list<BaseObject*>::sort

谢谢

最佳答案

您正在考虑执行双重分派(dispatch) - 即根据两个对象而不是一个对象的类型调用虚函数。看一看这篇维基百科文章,了解一下 http://en.wikipedia.org/wiki/Double_dispatch .我不得不说,每当我发现自己处于这种情况时,我都会尝试改变方向:-)

我可以对您的代码做一些观察吗?它没有任何问题,但是:

  • 在 C++ 中,std::list 是不得已的容器 - 您通常应该默认使用 std::vector,除非您特别需要只有 list 提供的功能:

    <
  • protected 数据总是一个坏主意

关于c++ - 对指针列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2554405/

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