我不确定是否可能,但锯齿状数组是否可以包含多种类型
我需要一个分层的数据结构,其中第一个 2D 层是字节类型然后接下来的 2D 层可以是整数类型或浮点类型,最后 2D 层将再次是字节,层的总数可以变化。
如果是的话,这可能吗,我将如何在 C# 中声明它以及如何在 C++ 中声明它?
我不确定是否可能,但锯齿状数组是否可以包含多种类型
我需要一个分层的数据结构,其中第一个 2D 层是字节类型然后接下来的 2D 层可以是整数类型或浮点类型,最后 2D 层将再次是字节,层的总数可以变化。
如果是的话,这可能吗,我将如何在 C# 中声明它以及如何在 C++ 中声明它?
我不了解 C#,但你不能在 C++ 中做到这一点(至少不能以同时有用、有意义和明确定义的方式)。
作为第一种解决方法,我建议使用数组结构:1
struct Stuff {
byte *bytes;
int *ints;
byte *bytesAgain;
};
这并不能满足您希望层数变化的愿望。目前尚不清楚这如何工作。你怎么知道每一层应该包含什么?
[也许如果您编辑问题以解释您要解决的问题,我可以给出更集中的答案。]
std::vector
而不是原始 C 样式的数组和指针。
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;
}
}
图层对象的矢量将起作用。Layer 对象将有一个指向 2D 数组的指针和一个表示 2D 数组类型的“提示”值。添加新图层时,您将向向量推送一个图层,该图层在构造时会被告知它是什么类型。
您已经将数据结构划分为层,为什么不在代码中也这样做呢?对第一层和最后一层使用两个 2D 字节数组,对中间的层集使用一个 3D 数组?
对于中间层中的数据类型,如果您注意记住哪个类型存储在哪个元素中,则可以使用联合。如果没有,您可以使用结构甚至类。
此外,您也可以将整个内容包装在一个类中。
虽然这是一个可疑的具体问题。您已经决定需要存储一个包含各种类型的锯齿状数组。为什么?
当然可以。只需使用一些对象和一些抽象。
你有没有锯齿状的数组是一些对象类型。然后该对象可以有一个 getType() 和一个 getValue()。GetType() 将返回一些枚举,而 getValue() 将返回实际对象。
我认为这是不直观且不易维护的。有没有更好的方法可以存储您的数据?将每个“层”作为单独的数组/对象怎么样?