如何将多个C++向量约束为相同的大小

How to constraint several C++ vectors to the same size?

本文关键字:约束 向量 C++      更新时间:2023-10-16

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

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

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

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

有没有办法强制数组/向量/任何东西始终保持相同的大小?

这可能是创建

自己的类来管理内存(没有业务逻辑,只有内存(有意义的一种情况。

当然,你可以围绕向量来表达这个类:

#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( 推入它们。

没有通用和显式的方法来约束向量。约束必须作为算法的不变性强制执行;每当将数据push_back到一个向量时,也要将其推送到另一个向量。(请务必保持向量private

如何保留成对的浮点数的向量?

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

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

这没有内存管理问题 - 您可以在堆栈或堆上创建一个"stuff"类,并且它不需要析构函数。