【发布时间】:2015-01-25 01:00:30
【问题描述】:
我想将多种类型的元素存储在一个向量中,同时保持相同类型的元素连续。这些类型派生自一个基类,我希望在整个开发周期中实现不同的类型。出于这个原因,如果将新类型添加到列表中的过程非常简单,将会有所帮助。
我可以(在一定程度上)通过以下方式实现这一点:
//header
enum TypeID { TypeA_ID, TypeA_ID, TypeA_ID, TypeIDAmount };
vector<TypeA> vectorA;
vector<TypeB> vectorB;
vector<TypeC> vectorC;
//cpp
TypeBase* LookUp(TypeID type, int index)
{
switch(type)
{
case TypeA_ID: return (TypeBase*) &vectorA[index];
case TypeB_ID: return (TypeBase*) &vectorB[index];
case TypeC_ID: return (TypeBase*) &vectorC[index];
}
}
然而,这并不干净、易于维护,也不便于编译(保存数据的类包含在很多地方)。
我认为这样做的一个对编译更友好(但更丑陋)的选项
//header
void* vectorArray;
//cpp
void Initialize()
{
vectorArray = new void*[TypeIDAmount];
vectorArray[0] = new vector<TypeA>;
vectorArray[1] = new vector<TypeB>;
vectorArray[2] = new vector<TypeC>;
}
TypeBase* LookUp(TypeID type, int index)
{
void* pTypedVector = &vectorArray[type];
switch(type)
{
case TypeA_ID: return (TypeBase*) (*(vector<TypeA>*)pTypedVector)[index];
case TypeB_ID: return (TypeBase*) (*(vector<TypeB>*)pTypedVector)[index];
case TypeC_ID: return (TypeBase*) (*(vector<TypeC>*)pTypedVector)[index];
}
}
(嗯!)
有什么可以像这样通用的吗?
vector< vector<?>* > vectorOfVariedVectors;
编辑:
这种结构的动机是将组件存储在实体-组件设计模式中。
我希望类型(或者更确切地说,组件)是连续的的原因是能够以缓存友好的方式横穿它们。这意味着我希望实例本身是连续的。虽然使用连续指针会给我一个类似于我想要的行为,但如果它们指向内存中的“随机”位置,那么在获取它们的数据时仍然会发生缓存未命中。
避免内存碎片是一个很好的额外好处。
主要思想是拥有一个干净的管理器类型类来保存并提供对这些元素的访问。不希望有其他开发人员必须添加到此类的多个成员向量,只要这需要创建新类的用户来更改此管理器类。对此容器类的编辑应该尽可能简单,或者希望不存在。
找到解决方案
感谢 Dmitry Ledentsov 将我指向this article。这几乎就是我想要的。
【问题讨论】:
-
TypeA、TypeB 和 TypeC 类是你实现的吗?
-
您需要重新考虑您的设计。多态性的重点是您不需要知道确切的类型,那么为什么要让它们连续呢?
-
我想在一个向量中存储多种类型的元素 - 为什么?这个功能应该如何使用?
-
为什么每种类型没有一个向量?
-
查看这篇文章:1
标签: c++ vector generic-programming contiguous