如何将几个C ++向量约束到相同的大小?

时间:2012-01-04 13:04:12

标签: c++ arrays stl vector

我有一个包含一组C动态数组的类,这些数组的大小都相同,其中一个成员就是这些数组的大小:

class stuff {
  int size;
  float *abc;
  float *def;
  // etc.
 };

为了简化这个类(以及许多其他具有类似布局的类)的内存管理,我想使用标准容器。但是我必须保持C数组(和向量)提供的对齐约束,因为这些数据将在很多C函数中传递。

我的问题是每个向量都有自己的大小,这是多余的,如果由于某种原因而改变其大小而不是其他大小,则可能导致错误。

有没有办法强制数组/向量/ whatevers总是相同的大小?

4 个答案:

答案 0 :(得分:4)

这也许就是这样一种情况,即创建一个自己的类来管理内存是有意义的(没有业务逻辑,只有内存)。

当然,你可以围绕矢量阐述这个类:

#define CHECK_CLASS_INVARIANT() \
  ClassInvariant inv##__LINE__ (*this); (void) inv##__LINE__;

class Foo {
public:
  size_t size() const { return _a.size(); }

  float* getA() { return &_a[0]; }
  float* getB() { return &_b[0]; }

  void push(float a, float b) {
    CHECK_CLASS_INVARIANT()
    _a.push_back(a);
    _b.push_back(b);
  }

private:
  struct ClassInvariant {
    ClassInvariant (Foo& f): _f(f) {}
    ~ClassInvariant () { assert(_f._a.size() == _f._b.size()); }

    Foo& _f;
  }; // struct ClassInvariant

  std::vector<float> _a;
  std::vector<float> _b;
};

我们确保始终检查类不变量(在变异方法中)以确保它始终适用。

注意:这里有一个小小的流程,如果_b.push_back(b);抛出,那么_a被扩展而_b没有,这可以在try / catch块中处理或者正如SteveJessop恰当地评论的那样,通过(1)预先在两个向量中保留足够的空间并且(2)推入它们。

答案 1 :(得分:1)

没有通用和明确的方法来约束矢量。约束必须作为算法的不变量来强制执行;每当你push_back数据到一个向量时,也将它推送到另一个向量。 (务必保留向量private

答案 2 :(得分:1)

如何保持一对浮动的向量呢?

答案 3 :(得分:0)

我不是100%确定我明白你的问题是什么,但看起来你想要这样的东西:

template<int SIZE> class stuff {
  float abc[SIZE];
  float def[SIZE];
  // etc.
 };

这没有内存管理问题 - 你可以创建一个&#34;东西&#34;堆栈或堆上的类,它不需要析构函数。