如何将多个C++向量约束为相同的大小
How to constraint several C++ vectors to the same size?
我有一个类,其中包含一组大小相同的 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"类,并且它不需要析构函数。
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 具有单位向量约束的非线性优化
- 提升精神业力 - 具有约束和传播失败的字符串的输出向量
- 如何将多个C++向量约束为相同的大小
- 结构体向量的问题:解约束迭代器(可能很容易)
- 快速和简单的约束规划涉及向量(数组)
- 具有约束的向量的向量上合并成员函数的级联应用