3

イテレータpと頂点curvePointsがあります。

for (p = curvePoints.begin(); p != curvePoints.end(); p++) {
  p->x = (1 - u) * p->x + u * (p+1)->x;
  p->y = (1 - u) * p->y + u * (p+1)->y;
}

現在、ループは次のインデックス付きオブジェクトの値を使用しています。次の値が存在することをどのように保証できますか。つまり、ループ条件をまたはのようにするにはどうすればよいです(p+1) != curvePoints.end()p != curvePoints.end() - 1

4

5 に答える 5

3

そのままの状態でお使いいただけますstd::distance(p, curvePoints.end()) > 1

http://www.cplusplus.com/reference/std/iterator/distance/

于 2012-10-05T10:51:11.503 に答える
1

p-ssuccessorの値をキャッシュして再利用できます。

auto p = curvePoints.begin();
if (p != curvePoints.end()) {
  auto pn = p; ++pn;
  for (; pn != curvePoints.end(); p = pn, ++pn) {
    ... // use pn instead of (p+1)
  }
}

注意:イテレータにはプリインクリメントが望ましいです。

于 2012-10-05T10:58:42.687 に答える
1

How about changing p != curvePoints.end() to
(p != curvePoints.end()) && ((p + 1) != curvePoints.end())?

于 2012-10-05T10:50:17.180 に答える
0

end()私がそれをする方法は、シーケンスが空でない限り、比較しないことです。シーケンスが空でない場合はend() - 1、値と比較しておそらくキャッシュします。

for (auto p(points.begin()), 
          end(c.end() - (c.empty()? 0, 1));
     p != end; ++p) {
    ...
}
于 2012-10-05T13:08:55.287 に答える
-1
 for (p = curvePoints.begin(); p < curvePoints.end(); p++) {
          p->x = (1 - u) * p->x + u * (p+1)->x;
          p->y = (1 - u) * p->y + u * (p+1)->y;
于 2012-10-05T10:52:12.580 に答える