我正在观看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
?)
答案 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
函数返回的值。