2

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

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

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

4

5 回答 5

3

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

作为第一种解决方法,我建议使用数组结构:1

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

这并不能满足您希望层数变化的愿望。目前尚不清楚这如何工作。你怎么知道每一层应该包含什么?

[也许如果您编辑问题以解释您要解决的问题,我可以给出更集中的答案。]


1. 由于这是 C++,而不是 C,请考虑使用类似容器std::vector而不是原始 C 样式的数组和指针。

于 2012-07-16T20:15:18.683 回答
2

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;
    }
}
于 2012-07-16T20:29:44.113 回答
1

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

于 2012-07-16T20:26:42.267 回答
1

您已经将数据结构划分为层,为什么不在代码中也这样做呢?对第一层和最后一层使用两个 2D 字节数组,对中间的层集使用一个 3D 数组?

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

此外,您也可以将整个内容包装在一个类中。

虽然这是一个可疑的具体问题。您已经决定需要存储一个包含各种类型的锯齿状数组。为什么?

于 2012-07-16T20:22:53.470 回答
1

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

你有没有锯齿状的数组是一些对象类型。然后该对象可以有一个 getType() 和一个 getValue()。GetType() 将返回一些枚举,而 getValue() 将返回实际对象。

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

于 2012-07-16T20:19:10.117 回答