c – 对指针列表进行排序

前端之家收集整理的这篇文章主要介绍了c – 对指针列表进行排序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我再一次发现自己在C中完成了一些非常简单的任务.有时候我希望我可以在 java中从OO中学习我所知道的所有内容,因为我的问题通常都是从 Java开始思考.

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

  1. class BaSEObject {
  2. protected:
  3. int id;
  4. public:
  5. BaSEObject(int i) : id(i) {};
  6. virtual ~BaSEObject() {};
  7. };

我可以使用比较器结构对指向BaSEObject的指针列表进行排序:

  1. struct Comparator {
  2. bool operator()(const BaSEObject* o1,const BaSEObject* o2) const {
  3. return o1->id < o2->id;
  4. }
  5. };

它看起来像这样:

  1. std::list<BaSEObject*> mylist;
  2. mylist.push_back(new BaSEObject(1));
  3. mylist.push_back(new BaSEObject(2));
  4. // ...
  5.  
  6. mylist.sort(Comparator());
  7.  
  8. // intentionally omitted deletes and exception handling

直到这里,一切都很好.但是,我介绍了一些派生类:

  1. class Child : public BaSEObject {
  2. protected:
  3. int var;
  4. public:
  5. Child(int id1,int n) : BaSEObject(id1),var(n) {};
  6. virtual ~Child() {};
  7. };
  8.  
  9. class GrandChild : public Child {
  10. public:
  11. GrandChild(int id1,int n) : Child(id1,n) {};
  12. virtual ~GrandChild() {};
  13. };

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

>对于任何Child对象c和BaSEObject b,b< c
>要比较BaSEObject对象,请像以前一样使用其ID.
>要比较Child对象,请比较其变量.如果它们相等,则回退到规则2.
> GrandChild对象应该回退到Child行为(规则3).

我最初认为我可能会在比较器中做一些演员.但是,这会消除常数.然后我想可能我可以比较类型,但后来一切看起来都很乱,甚至都不正确.

我怎么能实现这种排序,仍然使用list< BaSEObject *> :: sort?

谢谢

解决方法

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

我可以对您的代码做一些观察.它并没有完全错误,但是:

>在C中,std :: list是最后的容器 – 你通常应默认使用std:;向量,除非你特别需要一个只有list提供的功能:>受保护的数据总是一个坏主意

猜你在找的C&C++相关文章