当列表/数组中的元素数量可变时,哪种结构最适合实现?

时间:2010-11-17 12:25:24

标签: c++ c arrays linked-list

我有一个稍微具体的问题。我在OpenCV上使用C / C ++。我的目标是将检测到的矩形存储在列表/数组样式结构中。但是,每个帧的长度都是可变的(迭代)。

我应该用什么来存储这些信息?我想到了链接列表,然而,它们遍历很慢,而且如果节点数量减少,我将不得不手动删除额外的节点,这将占用更多的处理器时间。我丢弃了Arrays,因为它们的长度不够灵活。我可以使用malloc做动态数组,但即便如此,我认为我需要指定最大元素数。

如果我在某处错了,请随时纠正我。另外,请分享您的观点并让我知道您认为最好的方法是什么?

由于

编辑:我不限于C(我知道我提到了malloc)。我可以使用C ++功能以及我的程序的其余部分不使用任何C特定的功能。所以请随时向我推荐任何更好的方法。

5 个答案:

答案 0 :(得分:9)

我建议您使用std::vectorstd::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个分配)都是微不足道的,并且不涉及任何分配。 “删除”是一个不同的故事,但鉴于您的问题陈述,您似乎无论如何都不需要。