c++ - 按类型对 std::vector 进行排序

标签 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 进行排序,使每种类型的元素都是相邻的?

有没有办法不使用虚函数来识别每个派生类型? (也许使用 typeid?)

最佳答案

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

这是一个例子:

#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

关于c++ - 按类型对 std::vector 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23085715/

相关文章:

c++ - 如何用自定义比较表示一组指针但保持原始原始指针重复比较

c++ - 为什么不能将此参数包直接解包到 vector 初始值设定项列表中?

linux - 使用 shell 对行条目进行排序

Java:继承构造函数

使用静态变量的 C++ 继承成员函数

java - Hibernate 从同一个请求返回同一个实体,但在一种情况下它被代理,而在第二种情况下它不是。为什么?

c++ - C++ 复制保护 API

c++ - cocos2d-x中使用CCBReader报错

c - 按升序插入记录函数 - C 作业

C# 使用 IComparer 对 x 列进行排序