异构阵列实现
回答
正如拉维提到的,适当的数据结构称为标签联合(也称为变体记录)。实现它的一种方法是:
typedef union {
int tag;
struct {
int tag;
int val;
} int_;
struct {
int tag;
double val;
} double_;
} object;
然后,您可以制作这些数组。
object arr[5];
您可以使用tag
字段来指示哪个联合成员正在使用中。通常使用enum
。
enum type { INT, DOUBLE };
然后在创建对象时设置标签,并在访问之前检查标签。这可以通过使用构造函数函数来封装。
object new_int(int i){
object ret;
ret.tag = INT;
ret.int_.val = i;
return ret;
}
object new_double(double d){
object ret;
ret.tag = DOUBLE;
ret.double_.val = d;
return ret;
}
而且您通常要在标签上使用switch
访问,书写了每种类型的不同情况。
void print_object(object x){
switch(x.tag){
case INT: printf("%d\n", x.int_.val); break;
case DOUBLE: printf("%f\n", x.double_.val); break;
}
}
或者在某些情况下,您可能希望将数组折叠为单个类型,以便每次都可以在不检查标记的情况下访问该数组。
for (i = 0; i < sizeof arr/sizeof*arr; i++)
if (arr[i].tag == INT)
arr[i] = new_double(arr[i].int_.val);
在C++中没有这样的数组可以存储不同类型的元素,也没有stl中的容器。虽然有一种方法可以在容器中存储不同的元素,但条件是那些类型应该通过继承来关联。
在C中有一个叫做标签联合的概念,它可以存储不同类型的标签,以此来指定哪个变量实际存在。
另一种方法是使用void *指针数组。虽然这将是相当丑陋的C++。这不会是真正异类的,因为您正在使用任何指针可以投入的指针类型。它类似于制作基类类型的集合,然后存储派生类的对象。
我是从斯特劳斯文章有: -
如果您需要在C++异构容器,就定义一个通用接口的所有元素,并将这些的容器。例如:
class Io_obj { /* ... */ }; // the interface needed to take part in object I/O
vector<Io_obj*> vio; // if you want to manage the pointers directly
vector< Handle<Io_obj> > v2; // if you want a "smart pointer" to handle the objects
从升压::
除了任何也可用于: -
vector<Any> v;
请看[this](http://www.boost.org/doc/libs/1_54_0/doc/html/any.html)。它可以用来实现异构阵列吗? – leader 2014-11-06 06:15:25
@eader:是的,它可以很好地移动“隐藏”类型的东西,但是因为您需要指定类型以从中获取数据,因此您需要对其执行任何操作。 – 2014-11-06 07:21:29
我想你可以保持指针数组以任何
void* stuff[size];
const char* str = "hello";
int x = 20;
int *array = malloc(sizeof(int) * 5);
stuff[0] = str;
stuff[1] = &x;
stuff[2] = array;
另外,如果你事先知道所有的类型,那么就是一系列的工会。
您将如何将输入数据转换为数据结构?你可以解释吗?我猜你会使用类型转换,并且需要先检查数据类型,然后才能正确处理? – leader 2014-11-06 06:20:45
我加了一些例子。一个结构数组,每个都有一个'type'字段和'void *'元素也可能被证明是有用的。 – ryanpattison 2014-11-06 06:27:29
filename.cpp \t [错误]'stuff'没有指定类型 – leader 2014-11-06 06:30:03
- 1. 如何实现与阵列
- 2. 在异构阵列上调用preprocessing.scale
- 3. 无法实现与2-d阵列结构中在C
- 4. 发现两个阵列的差异
- 5. ExpandableList阵列资源实现问题
- 6. 为自定义2D阵列实现Parcelable
- 7. 子类有不同的阵列实现
- 8. OnClickListener()实现Android中的按钮阵列
- 9. 如何在Salesforce中实现FieldSets阵列
- 10. 实现带有JSON阵列交叉值
- 11. 负指数阵列的实现
- 12. 实现差异
- 13. 构建阵列
- 14. 构建阵列
- 15. 重构阵列
- 16. 构建阵列
- 17. 领域 - 实现异步队列
- 18. 发现阵列
- 19. 阵列实例
- 20. 从其他阵列构建阵列
- 21. JS阵列 - 如何构建阵列
- 22. 在数据结构中实现队列
- 23. 链接列表实现与结构
- 24. 修复阵列越界异常新阵列异常
- 25. 如何找到阵列和阵列阵列之间的差异
- 26. 实现python异常
- 27. Android - 实现差异
- 28. 从结构阵列
- 29. C++重构阵列
- 30. Mongodb阵列结构
我认为你已经习惯了其他语言。 – Beta 2014-11-06 06:04:21
取决于!也许是一个带有指向某个内存的void指针的链表,但肯定不是'array'。 – 2014-11-06 06:04:37
@ Beta你在暗示什么?你能清楚吗? – leader 2014-11-06 06:06:27