按类型对std :: vector进行排序

时间:2014-04-15 13:50:24

标签: c++ sorting inheritance

我正在观看http://channel9.msdn.com/Events/GoingNative/2013/Writing-Quick-Code-in-Cpp-Quickly并且在36分钟左右,他们谈论了如果要在其上调用虚拟方法,则按照元素类型对集合进行排序的好处。

所以给出

class Base {};
class Der1 : public Base {};
class Der2 : public Base {};
class Der3 : public Base {};

vector<Base *> myVector;

你怎么能以这样的方式对myVector进行排序,使每种类型的元素都是adjecent?

如果不使用虚函数来识别每个派生类型,有没有办法做到这一点? (也许使用typeid?)

4 个答案:

答案 0 :(得分:9)

您可以使用type_index。您从type_info运算符返回的typeid对象构造一个。它是一个具有重载关系运算符的类,具有良好定义的排序,因此它在关联容器等中作为键类型很有用。

以下是一个例子:

#include <typeinfo>
#include <typeindex>
#include <vector>
#include <algorithm>
#include <iostream>

struct Base {
    virtual ~Base() {}
    virtual const char* who() = 0;
};
struct D1 : Base { const char* who() { return "D1\n"; } };
struct D2 : Base { const char* who() { return "D2\n"; } };
struct D3 : Base { const char* who() { return "D3\n"; } };

int main()
{
    std::vector<Base*> vec { new D2, new D1, new D3, new D3, new D1, new D2 };
    std::sort( vec.begin(), vec.end(),
    [](const Base* p1, const Base* p2)
    {
        return
            std::type_index(typeid(*p1)) <
            std::type_index(typeid(*p2));
    });

    for (auto p : vec) { std::cout << p->who(); }
}

输出结果为:

D1
D1
D2
D2
D3
D3

答案 1 :(得分:0)

指定比较功能。有关详细信息,请参阅示例Sorting an STL vector on two values

在比较功能中,你可以写任何你想要的东西。它可以比较对象的任何属性。特别是,它可以比较通过虚拟函数获得的一个特定值,例如getType(),其可能在Der1中返回1,在Der2中返回2,在Der 3中返回3。

答案 2 :(得分:0)

你可以实现一个虚函数,比如prio,它返回类型中的优先级(int); prio将在派生类中适当地实现。然后实现一个比较器,该比较器将评估prio的两个实例上的Base来比较它们。

答案 3 :(得分:0)

这些只是可能性,对此没有一个真正的答案。

分拣?

排序的主要问题是找到要排序的密钥。如果你愿意,这是“第1阶段”。第2阶段使用标准库中的通用排序,通常比第1阶段更容易。

键控

一种可能性是使用typeid / type_info

type_info定义operator ==operator !=的实例,以及hash_code成员函数。

排序

使用标准算法中的通用排序算法。作为分类的关键,您可以使用例如从hash_code函数返回的值。