让我和背景一起解释我的问题,这样就更容易理解为什么我要求这种特定类型的东西。我正在开发一个即时通讯工具。我的老师概述了大多数架构,但实现细节可能有所不同。有一个“Engine”类,EventManager,它注册客户端。为了识别它们并轻松删除它们,我使用了一个地图(带有客户端ID)或带有指针的集合。到现在为止还挺好。但是这个EventManager使用poll()
(或select()
,但是这个poll()
使用起来很舒服,因为每次都必须重建阵列,这很慢而且不那么 - 好吧,我猜,我可以在主循环中将自己限制在UNIX环境中,如果你问的话。哪个需要一个struct pollfd
数组。现在,每当新客户端出现或运行时,都需要重建此阵列。我手动使用动态数组并每次分配内存(baaaaaad),或者我使用一个向量,它可以在容器的末尾很好地处理新客户端的struct pollfd
插入,或者插入一个deque,它会插入并删除任何地方很好。现在我的两个问题是:
vector
,它会自动收缩并在自身中间移动元素而不是完全重新分配吗?和&myVector[0]
)或者它是否严格不连续? 答案 0 :(得分:4)
如果您从vector
的中间删除某些内容,它会将所有以下元素移到开头的一个位置。它将不重新分配。您根本不需要考虑重新分配,因为它们按摊销时间为每次插入提供O(1)时间。
deque并不比矢量好多少。从开头或结尾删除是有效的。不是从中间。如果你从任何地方移除,那么它有望是矢量的两倍,但速度不快。由于它是一个更复杂的结构,它可能会更慢。 deque不保证连续存储,因此虽然允许在O(1)时间内完成索引,但仍然无法将其可靠地转换为指针。
无论如何,它闻起来像是过早优化。使用矢量。由于客户端的顺序并不重要,您可以通过使用向量中的最后一个元素交换要删除的元素并在此之后调用pop_back()
来加快客户端的擦除。