【问题标题】:Erasing first element while iterating with CGAL circulator使用 CGAL 循环器迭代时擦除第一个元素
【发布时间】:2019-08-23 22:11:16
【问题描述】:

我有一个 CGAL::Polygon_2<Kernel> 并使用 CGAL 顶点 circulator 迭代它的顶点。在 CGAL 文档中,我找不到有关如何正确使用擦除功能的任何信息。 中间删除没问题,但是当循环器的第一个元素被删除时如何处理呢?

天真的iterator erasing approach只在第一种情况下有效,在第二种情况下,循环在一次迭代后结束。

// p is of type CGAL::Polygon_2<Kernel>
auto ci = p.vertices_circulator();
auto start = ci;
int i = 0;

do {
  if (i == 0) {
    ci = p.erase(ci);
  } else {
    ++ci;
  }
  ++i;     
} while (ci != start);

这意味着start 指向以前的第二个元素/现在删除第一个元素后的第一个元素?

我该如何处理这种情况? 谢谢!

【问题讨论】:

    标签: c++11 iterator cgal erase


    【解决方案1】:

    do 之前使用--start 将起作用。

    【讨论】:

    • 循环不会因这个添加而终止。 start 指针在擦除后变得无效(基于CGAL::Polygon_2? 中的默认向量容器类)。但一个可行的解决方案是在 while 条件下将 start 替换为 --p.vertices_circulator()。这种解决方案的缺点是最后一个元素必须单独处理。
    猜你喜欢
    • 2020-06-08
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多