std::vector是否适合频繁调整大小
Is std::vector good for frequent resizing?
我正在创建一个有小"粒子"的游戏。它们的数量变化非常频繁(每隔几秒钟),我想知道存储它们的最佳方式是什么。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执行。
相关文章:
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- 为什么 vector 的方法调整大小会创建一个额外的对象?
- 访问"std::vector"的保留但未调整大小的内存作为原始内存是否安全?
- 比较推送数据(100 万个数字)在 std::vector 中预先调整大小和没有
- 如何使用 std::vector<std::tuple<A,B>> 来管理内存(调整大小、保留,...),但实际上将 As 保留在 B 之前,连续
- 如何判断 std::vector 是否调整了自身大小,以及如何解释指向向量内值的指针不再有效
- 调整 std::vector<std::atomic_bool> 的大小,为所有原子布尔值分配 true
- "std::vector"在调整大小时引发"bad allocation"异常
- 在不破坏元素的情况下调整std::vector的大小
- 将vector::resize()的大小调整为较低计数时重新分配的空间
- 用std::vector编写可调整大小的矢量时出现问题
- 当“std::vector”调整内存大小时,避免使用任何自动变量
- std::vector是否适合频繁调整大小
- 在 std::vector 上调整大小不会调用移动构造函数
- 调整嵌套std::vector的大小
- 在不初始化数据的情况下调整 std::vector C++的大小<char>
- vector.resize()方法在调整大小时调用默认的元素构造函数
- 在c++中调整vector大小时调用一次类构造函数
- 调整大小时出现Std::vector和内存错误
- 调整 std::vector<AbstractClass*> 的大小