2014-11-06 73 views
2

我将不胜感激您的帮助!异构阵列实现

哪个数据结构用于实现C或C++中的异构数组?该数组可能包含任何标准的数据类型,如int,float,char,string等...

+0

我认为你已经习惯了其他语言。 – Beta 2014-11-06 06:04:21

+0

取决于!也许是一个带有指向某个内存的void指针的链表,但肯定不是'array'。 – 2014-11-06 06:04:37

+0

@ Beta你在暗示什么?你能清楚吗? – leader 2014-11-06 06:06:27

回答

3

正如拉维提到的,适当的数据结构称为标签联合(也称为变体记录)。实现它的一种方法是:

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); 
1

在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; 
+0

请看[this](http://www.boost.org/doc/libs/1_54_0/doc/html/any.html)。它可以用来实现异构阵列吗? – leader 2014-11-06 06:15:25

+0

@eader:是的,它可以很好地移动“隐藏”类型的东西,但是因为您需要指定类型以从中获取数据,因此您需要对其执行任何操作。 – 2014-11-06 07:21:29

0

我想你可以保持指针数组以任何

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; 

另外,如果你事先知道所有的类型,那么就是一系列的工会。

+0

您将如何将输入数据转换为数据结构?你可以解释吗?我猜你会使用类型转换,并且需要先检查数据类型,然后才能正确处理? – leader 2014-11-06 06:20:45

+0

我加了一些例子。一个结构数组,每个都有一个'type'字段和'void *'元素也可能被证明是有用的。 – ryanpattison 2014-11-06 06:27:29

+0

filename.cpp \t [错误]'stuff'没有指定类型 – leader 2014-11-06 06:30:03