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

时间:2011-05-10 06:07:22

标签: c++ vector

我在C ++中看到了很多关于矩形2-D数组的讨论,但与我正在使用的内容没有太大关系。我需要在固定数量的事情上保留相同的信息,所以我创建了一个结构,我想我想要一个矢量向量,所以我做了以下定义:

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似乎有分配问题。

首先,这是处理问题的最佳方法吗?如果是这样,我是否正确处理这些动态分配的,粗糙的向量?

由于

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

然而:

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