我不确定是否有可能 但是锯齿状数组可以包含多种类型
我需要一个分层的数据结构,其中第一个2D层是字节类型 然后,下一个2D层可以是整数类型或浮点类型,最后2D层将再次为字节,总层数可以变化。
是可能的,如果是的话,我将如何在C#中声明它以及如何在c ++中声明?
答案 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数组的类型。添加新图层时,您可以向图层推送一个图层,在构造时会告诉它它是什么类型。