std::vector是否适合频繁调整大小

Is std::vector good for frequent resizing?

本文关键字:调整 vector 是否 std      更新时间:2023-10-16

我正在创建一个有小"粒子"的游戏。它们的数量变化非常频繁(每隔几秒钟),我想知道存储它们的最佳方式是什么。std::vector还是std::deque更好?

可以保留永远不会被使用的空间(在那个容器里)吗(我有上限)?

如果顺序不重要(我认为它不重要),你可以用向量中的另一个粒子代替粒子,而不是移除一个粒子

std::vector<Particle> particles;

当你移除索引为i的粒子时,只需用最后一个填充空白:

particles[i] = particles.back();
particles.pop_back();

如果使用指针的矢量,您可以使它更快。

如果为向量保留了足够的空间,调整大小也不错,因为它不需要复制向量的内容。

另一方面,出列可以比向量更有效地增长,其容量可以自动管理,特别是在大序列中,因为可以避免大规模的重新分配。

它实际上归结为用法。如果您的向量未排序,如果您实际上正在移除该粒子,则在向量中查找该粒子的复杂性为O(n),并且整个向量将被复制,因此数据保持连续。对于deque,仍然需要O(n)才能找到,但移除是微不足道的。然而,如果你像一样迭代

foreach (particle in particles)
{
    if(particle.update() == END_OF_LIFE)
    {
        particle.alive = false;
    }
    else
    {
        particle.draw();
    }
}

您可以在没有显著开销的情况下完成此操作,但要插入新粒子,您要么需要遍历每个粒子以找到可以替换的第一个"死"粒子(O(n)),要么在单独的std::列表中跟踪这些信息。

我们需要知道一件事才能有效地回答——你是否需要索引到一个特定的粒子("给我列表中的第1000个粒子")?另外,你有没有按某个ID查找过("找到ID为421932的粒子")?如果前者,vector将在恒定时间内执行,而后者将由std::unordered_set(hash_set的c++x11版本,类似于boost prex11中的选项)在恒定时间中执行,logn时间由std::set执行。