代码之家  ›  专栏  ›  技术社区  ›  iksemyonov

C++智能线性容器

  •  1
  • iksemyonov  · 技术社区  · 14 年前

    让我把我的问题和背景一起解释一下,这样就更容易理解为什么我要这种特定类型的东西了。我正在开发一个即时通讯器。大多数架构都由我的老师概述,但是实现细节可能有所不同。有一个“引擎”类,eventmanager,用于注册客户机。为了识别它们并方便地删除它们,我使用一个映射(带有客户机ID)或一个带有指针的集合。到目前为止,一切都很好。但是这个事件管理器使用 poll() (或) select() 但是没有比这更舒适的地方了 污染() ,因为您每次都必须重新构建数组,这很慢,而且不是很好,我想,如果您要求的话,我可以将自己限制在UNIX环境中)。需要一系列 struct pollfd . 现在,每当新客户机出现或消失时,都需要重新构建这个数组。要么我手工使用一个动态数组,每次都分配内存(baaaad),要么我使用一个向量,它可以处理新客户机的 结构轮询 在容器的末尾插入非常好,或者说是deque,它可以很好地插入和移除任何地方。现在我的两个问题是:

    1. 如果我选择 vector ,它是否会自动收缩和移动中间的元素,而不是完全重新分配?和
    2. 不管怎样,如果是开始的话,那会复制很多,所以我想用deque。是否有数组接口(就像处理向量一样)- &myVector[0] )或者它是完全不连续的?
    1 回复  |  直到 12 年前
        1
  •  4
  •   Yakov Galka    14 年前
    1. 如果你从一个 vector 它将把下面的所有元素向开始移动一个位置。会的。 重新分配。你根本不需要考虑重新分配,因为它们是摊销的,每插入一次就给O(1)次。

    2. deque并不比vector好多少。从开始或结束移除是有效的。不是从中间。如果你从任何地方移除,那么它的速度可能是向量的两倍,但不会更快。因为这是一个更复杂的结构,它可能会更慢。DEQUE不保证连续存储,因此尽管允许索引并在O(1)时间内完成,但仍然无法将其可靠地转换为指针。

    不管怎样,这听起来像是过早的优化。使用矢量。由于客户机的顺序不重要,因此可以通过将要移除的元素与向量中的最后一个元素交换并调用来加快客户机的擦除速度。 pop_back() 之后。