我有一个稍微具体的问题。我在OpenCV上使用C / C ++。我的目标是将检测到的矩形存储在列表/数组样式结构中。但是,每个帧的长度都是可变的(迭代)。
我应该用什么来存储这些信息?我想到了链接列表,然而,它们遍历很慢,而且如果节点数量减少,我将不得不手动删除额外的节点,这将占用更多的处理器时间。我丢弃了Arrays,因为它们的长度不够灵活。我可以使用malloc做动态数组,但即便如此,我认为我需要指定最大元素数。
如果我在某处错了,请随时纠正我。另外,请分享您的观点并让我知道您认为最好的方法是什么?由于
编辑:我不限于C(我知道我提到了malloc)。我可以使用C ++功能以及我的程序的其余部分不使用任何C特定的功能。所以请随时向我推荐任何更好的方法。答案 0 :(得分:9)
我建议您使用std::vector
。 std::vector
中的元素由C ++标准保证是连续的,就像C 数组一样。这允许std::vector
成为C ++数据结构和C函数之间的接口。您可以使用std::vector<T>::resize
确保在将其传递给OpenCV函数之前已分配空间。
哦,要获得指向矢量内部存储的指针,通常使用这种表示法:&rectangleCollection[0]
。
答案 1 :(得分:3)
您可以执行动态数组,并在需要增长时使用realloc()
。如果可能的话:
当然,你也可以做一些更复杂的事情,但我建议先用普通的重新分配数组进行测试。
答案 2 :(得分:1)
通常,您将释放现有的最大大小数组,然后分配一个更大的新数组,并将原始指针指定给新数组。此外,没有必要或没有理由缩小你的阵列只是因为你没有填充它,如果你知道将来你可能需要更多的空间。这会浪费性能,不断调整数据结构的大小,使其完全适合其中的数据。
编辑:哦,所以你实际上在使用C ++。在这种情况下,只需获得一个向量。
答案 3 :(得分:0)
如果您希望使用向量,因为它们具有灵活性,但仅限于C,您可以使用结构和支持函数轻松复制其行为。以下是C向量的示例定义:
struct cvector {
rectangle** array_;
int size_;
int allocation_;
};
array_将保存指向矩形的内部指针数组,size_将保存向量中有效矩形的总数,并且分配是当前为array_分配的空间量。您可能编写的辅助函数的一些示例声明可用于此:
int cvector_push_back(rectangle* rec);
rectangle* cvector_access(int index);
cvector* cvector_create();
int cvector_free(cvector* cv);
如果您在访问界面时坚持使用界面,那么您应该能够在没有太多工作的情况下获得矢量的相同功能。
答案 4 :(得分:0)
答案取决于:
通常我会推荐在DirectX SDK中找到的CGrowableArray。 (您不需要包含DirectX,只需删除该类模板) (如果您不想使用C ++类模板,则可以轻松实现与一堆C函数相同的逻辑)
它对std :: vector有什么好处?
a)使用启发式
分配对象的头部时间b)你可以重置()它,它只会破坏包含的对象,但不会释放内存。
你重置每个帧()数组,然后愉快地添加你的对象。 您只需支付ctor / dtor电话费,但(大多数情况下)不支付免费电话费。
另一方面,如果你不打算存储实际的对象而是指针,那么侵入式链表是理想的。在这种情况下,“附加”(2个分配)和“清除”(1个分配)都是微不足道的,并且不涉及任何分配。 “删除”是一个不同的故事,但鉴于您的问题陈述,您似乎无论如何都不需要。