矢量和许多指数

时间:2014-02-10 20:23:07

标签: c++ containers

情况:我正在阅读由几何块组成的3D文件格式。反过来,每个块都有对任何块的引用(使用索引)(类似于可能的可见集)。

我正在设计的程序应允许在列表中的任何位置插入和删除块。这意味着许多引用将变为无效。

这样做的一个解决方法是在读取文件时将索引转换为指针,因此要有一个像这样的指针向量:

class block;

class block
{
    std::vector<block*> a_references;

    // more data
};

std::vector<block*> a_blocks;

在我的程序中,用户可以查看a_blocks数组的每个块的引用块。在这里,我想将它们显示为 indices 。在索引上使用指针时,这意味着我必须为每个块执行std::find以在数组中查找其索引。这会导致我认为会产生很多开销吗?

哪种方法更好,性能优势是什么?

1 个答案:

答案 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
};

删除后,您可以快速访问引用它的块 在插入/删除时,您必须以线性时间更新所有索引