C++中的动态非矩形二维向量

Dynamical, non-rectangular two dimensional vectors in C++

本文关键字:二维 向量 动态 C++      更新时间:2023-10-16

我在C++中看到了很多关于矩形二维数组的讨论,但对我正在使用的内容却不多。 我需要在固定数量的事物上保留相同的信息,所以我创建了一个结构,我想我想要一个向量的向量,所以我做了以下定义:

typedef struct sInfo {
  int  Length;
  int  RemainingReadLength;
  int  RemainingWriteLength;
  bool FillFlag;
  int  Offset;
}; 
class InfoClass {
protected:
<vector<vector<sInfo> > vvInfo;
uint32                  Index1;
uint32                  Index2;
sInfo                   Info;
public:
InfoClass () : vvInfo(NUM_INFO) {}
void AddInfo() {
    vvInfo[Index1].push_back(Info);
}
uint getLength ()  {
  return (vvInfo[Index1][Index2].Length;
}
}

我在这里打算的是固定数量的行,每个行都可以独立扩展或收缩。 据我所知,ctor 正在创建NUM_ID空向量,至少一开始,getLength 是有效的。 但是,AddInfo似乎存在分配问题。

那么,首先,这是解决问题的最佳方式吗? 如果是这样,我是否正确处理了这些动态分配的参差不齐的向量?

谢谢

你的方法对我来说还不错。但是,如果您有固定数量的行并且可以访问 C++0x/TR1,则可以使用 std::(tr1::)array<T,N> .
那么,您所说的分配问题是什么?

好吧,当你推入外部向量时,它可能会重新分配,这会导致所有内部向量被复制,这意味着它们分配新内存,复制内容并释放旧内存。

然而:

  • C++0x 不再有这个问题,因为它在重新分配时使用移动构造函数,并且(前提是标准库作者正确实现了这些移动构造函数)它们继续使用新对象的旧内存。
  • 分配
  • 策略的设计使得每个成员平均只复制几次(1-2 表示重新分配因子 2,3-4 表示重新分配因子 1.5;取决于特定的实现)。
  • 使用写入时复制的实现不会有这个问题,但IIRC没有标准库将其用于向量(而有些用于字符串)
  • 如果您事先知道外部向量的大小并对其进行.reserve(),则不会发生重新分配,因此无需担心。