情况:我正在阅读由几何块组成的3D文件格式。反过来,每个块都有对任何块的引用(使用索引)(类似于可能的可见集)。
我正在设计的程序应允许在列表中的任何位置插入和删除块。这意味着许多引用将变为无效。
这样做的一个解决方法是在读取文件时将索引转换为指针,因此要有一个像这样的指针向量:
class block;
class block
{
std::vector<block*> a_references;
// more data
};
std::vector<block*> a_blocks;
在我的程序中,用户可以查看a_blocks
数组的每个块的引用块。在这里,我想将它们显示为 indices 。在索引上使用指针时,这意味着我必须为每个块执行std::find
以在数组中查找其索引。这会导致我认为会产生很多开销吗?
哪种方法更好,性能优势是什么?
答案 0 :(得分:0)
我会做什么(如果我正确理解你的问题): 保持索引:
class block
{
std::vector<std::size_t> a_references; // some indices in a_blocks
// more data
};
std::vector<block*> a_blocks;
然后将其重置为nullptr
,而不是删除元素
在孔中或向量末尾添加元素。
最后,你可能有一个崩溃功能,删除漏洞并修复索引。
另一种选择是:
class block
{
std::vector<block*> a_references;
std::vector<block*> back_references; // reference each block where `this` is in a_reference
std::size_t index; // index in a_blocks
// more data
};
删除后,您可以快速访问引用它的块 在插入/删除时,您必须以线性时间更新所有索引