Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从std::vector中删除元素后更新存储索引_C++_C++11_Stdvector_Notify_Erase - Fatal编程技术网

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;