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

Jos*_* D. 5 c++ sorting inheritance

我正在观看http://channel9.msdn.com/Events/GoingNative/2013/Writing-Quick-Code-in-Cpp-快速和大约36分钟,他们谈论按照元素类型对集合进行排序的好处如果你打算在它们上调用虚方法.

所以给定

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

vector<Base *> myVector;
Run Code Online (Sandbox Code Playgroud)

你怎么能myVector这样排序,每种类型的元素都是adjecent?

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

jro*_*rok 9

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

这是一个例子:

#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(); }
}
Run Code Online (Sandbox Code Playgroud)

输出是:

D1
D1
D2
D2
D3
D3
Run Code Online (Sandbox Code Playgroud)