C++ 从std::vector中删除元素后更新存储索引
假设我有一个点向量:C++ 从std::vector中删除元素后更新存储索引,c++,c++11,stdvector,notify,erase,C++,C++11,Stdvector,Notify,Erase,假设我有一个点向量: vector<int> points; 现在我决定删除点[3]。但是,如果我删除点[3],索引3之后的点的索引将向后移动,因此我需要通知所有三角形,它们存储的索引可能会更改。什么是通知三角形的合理方法?在我看来,最合理的方法是而不是删除顶点。因为如果你真的删除它们,那么你必须将所有顶点向右移动(平均为V/2个元素),然后你必须遍历所有三角形(总是T检查) 相反,可以将顶点标记为死顶点。只需在points数组中添加一些不正确的值(在您的示例中,-1是可以的)。每
vector<int> points;
现在我决定删除
点[3]
。但是,如果我删除点[3]
,索引3之后的点的索引将向后移动,因此我需要通知所有三角形,它们存储的索引可能会更改。什么是通知三角形的合理方法?在我看来,最合理的方法是而不是删除顶点。因为如果你真的删除它们,那么你必须将所有顶点向右移动(平均为V/2个元素),然后你必须遍历所有三角形(总是T检查)
相反,可以将顶点标记为死顶点。只需在points数组中添加一些不正确的值(在您的示例中,-1
是可以的)。每次删除一个标记只需要O(1)。有时,您可能希望物理删除死角点。您可以使用两个完整过程(一个在顶点上,一个在三角形上)完成此操作,并在线性时间O(V+T)内压缩网格
为了便于使用,我建议为网格创建一个类。在网格对象中,对类用户透明地维护死条目的数量。删除后,当部分无效条目变得相当大(如超过一半)时,调用无效顶点消除。您还可以创建三角形枚举方法,该方法将只在活动三角形上迭代(只是为了方便)
如果压缩花费的时间不大于删除次数乘以常数,则该方法确保每次删除的摊销时间为O(1)。假设T是下一个点,替换三角形中删除点的位置?或者三角形也被删除了,删除了谁的点?由删除的点组成的三角形也被删除了。三角形实例存储在哪里?作为包含的示例代码中的实例,还是某种容器?
struct Triangle {
int p0, p1, p2;
};
Triangle tri0;
tri0.p0 = 3;
tri0.p1 = 6;
tri0.p2 = 7;
Triangle tri1;
tri1.p0 = 4;
tri1.p1 = 6;
tri1.p2 = 7;