多种类型的锯齿状阵列

时间:2012-07-16 20:13:16

标签: c++ c#-4.0 jagged-arrays

我不确定是否有可能 但是锯齿状数组可以包含多种类型

我需要一个分层的数据结构,其中第一个2D层是字节类型 然后,下一个2D层可以是整数类型或浮点类型,最后2D层将再次为字节,总层数可以变化。

是可能的,如果是的话,我将如何在C#中声明它以及如何在c ++中声明?

5 个答案:

答案 0 :(得分:2)

我不知道C#,但你不能用C ++做到这一点(至少不是以同时有用,有意义和明确定义的方式)。

作为第一个切入方法,我建议使用数组结构: 1

struct Stuff {
    byte *bytes;
    int  *ints;
    byte *bytesAgain;
};

这并不涉及您希望层数变化的愿望。目前尚不清楚这是如何起作用的;你怎么知道每一层应该包含什么?

[也许如果你编辑你的问题来解释你试图解决的问题,我可以给出一个更有针对性的答案。]

<小时/> <子> 1。因为这是C ++而不是C,所以考虑使用像std::vector这样的容器而不是原始C风格的数组和指针。

答案 1 :(得分:1)

C#中的方法可能是以下之一:

// Base class for each layer
abstract class Layer
{
    public abstract int Rank { get; }
    public abstract int GetLength(int dimension);
}

// Individual layers would inherit from the base class and handle
// the actual input/output
class ByteLayer : Layer
{
    private byte[,] bytes;

    public override int Rank { get { return 2; } }

    public override int GetLength(int dimension)
    {
        return this.bytes.GetLength(dimension);
    }

    public ByteLayer(byte[,] bytes)
    {
        this.bytes = bytes;
    }

    // You would then expose this.bytes as you choose
}
// Also make IntLayer and FloatLayer

然后,您可以创建一个抽象来保存这些图层类型:

class Layers : IEnumerable<Layer>
{
    private ByteLayer top, bottom;
    private List<Layer> layers = new List<Layer>();

    public ByteLayer Top { get { return top; } }
    public IEnumerable<Layer> Middle { get { return this.layers.AsEnumerable(); } }
    public ByteLayer Bottom { get { return bottom; } }

    public Layers(byte[,] top, byte[,] bottom)
    {
        this.top = top;
        this.bottom = bottom;
    }

    public void Add(int[,] layer)
    {
        this.layers.Add(new IntLayer(layer));
    }

    public void Add(float[,] layer)
    {
        this.layers.Add(new FloatLayer(layer));
    }

    public IEnumerator<Layer> GetEnumerator()
    {
        yield return bottom;
        foreach (var layer in this.layers) yield return layer;
        yield return top;
    }
}

答案 2 :(得分:0)

当然可能。只需使用一些对象和一些抽象。

你有没有参差不齐的数组类型。然后,该对象可以具有getType()和getValue()。 GetType()将返回一些枚举,getValue()将返回实际对象。

我认为这是非直观的,不易维护。有没有更好的方法来存储您的数据?将每个“图层”作为单独的数组/对象怎么样?

答案 3 :(得分:0)

您已经将数据结构划分为多个层,为什么不在代码中执行此操作?对第一层和最后一层使用两个2D字节数组,在两者之间使用一组3D数组?

对于中间层中的数据类型,如果您注意记住哪个类型存储在哪个元素中,则可以使用union。如果没有,您可以使用结构甚至类。

另外,你也可以将整个事物包装在一个类中。

虽然这是一个可疑的具体问题。您已经决定需要存储一个混杂类型的锯齿状阵列。 为什么?

答案 4 :(得分:0)

Layer对象的向量可以工作。 Layer对象将具有指向2D数组的指针和“提示”值,该值将表示2D数组的类型。添加新图层时,您可以向图层推送一个图层,在构造时会告诉它它是什么类型。