【问题标题】:How do I write my own vector structure in C [closed]如何在 C 中编写自己的向量结构 [关闭]
【发布时间】:2011-06-06 21:27:17
【问题描述】:

这里我有一个指向第一个元素的指针和一个 int 来保存元素的数量。如何添加 malloc 和 calloc 进行内存分配?

struct vector_new           
  {
  char *start;
  int count;
  }

【问题讨论】:

  • std::vector 是如何低效的?看看 std::vector 代码它会告诉你答案
  • 你将不会std::vector更有效率。部分原因是std::vector 与原始指针相比没有开销。在最好的情况下,你会一样好。技术上不可能变得更好。
  • 作为一般规则,您可以超越标准库的几率非常低,因为已经投入了大量工作以使其更快。
  • @duffymo(和其他人):问题标题和标签表明提问者使用的是 C,而不是 C++。
  • C 确实提供了一个优势:如果您使用realloc 来扩展您的分配,那么可能您将避免使用new 和@ 所必需的副本987654326@。因此,虽然复杂性不会更好,但从实际的角度来看,您可以仍然得到显着的改进。

标签: c optimization vector


【解决方案1】:
vector = malloc(sizeof(struct vector_new))
vector->start = malloc(size);
vector->count = size;

我不确定你要的是什么。

顺便说一句,std::vector 有一个“已使用”大小和一个“已分配”大小,这是一种您不会在此处重现的语义。

我也同意你写这个的速度不太可能比 std::vector 快。使用 C 而不是 C++ 可能是有原因的,但这不是其中之一。

【讨论】:

    【解决方案2】:

    您正在寻找“动态数组”实现。

    您可以跟踪数组中当前有多少对象以及为其分配了多少空间。当您需要更多空间时,您可以致电realloc 并请求current_size * factor,其中factor 大于一。 factor 的典型值介于 1.4 和 2 之间。

    可以证明,将n 项追加到数组的摊销成本为 O(n)。

    请注意,如果您想在中间插入东西,这不是高效。那是另一种生物。

    【讨论】:

    • 一个可能的改进:stackoverflow.com/questions/4834490/…
    • @R.. 不错。显然对交互式应用程序有用(以减少可怕的复制阶段延迟),可能不适用于批处理。
    • 它对于需要保证 O(1) 附加的实时应用程序特别有用。
    【解决方案3】:

    我不确定我是否理解您的问题,但这是否是您要查找的内容:

    vector_new vec;
    vec.count = 10;
    vec.start = malloc(vec.count);
    

    【讨论】:

    • 在 C 中,转换 malloc 的返回值充其量是多余的,并且可能隐藏编译器在没有转换时会捕获的错误。不要投射。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 2012-10-10
    • 2012-09-18
    • 1970-01-01
    相关资源
    最近更新 更多