【发布时间】:2010-04-07 20:19:38
【问题描述】:
我正在编写一个算法,它遍历点列表,计算它们之间的距离,如果距离太大,则插入额外的点。然而,我似乎缺乏对 STL 的适当熟悉来提出一个优雅的解决方案。我希望我能学到一些东西,所以我将向您展示我的代码。您可能对我有一些提示。
for (std::list<PathPoint>::iterator it = ++points_.begin();
it != points_.end(); it++)
{
Vector curPos = it->getPosition();
Vector prevPos = (--it)->getPosition();
Vector vecFromPrev = curPos - prevPos;
float distance = vecFromPrev.abs();
it++;
if (distance > MAX_DISTANCE_BETWEEN_POINTS)
{
int pointsToInsert = (int)(distance / MAX_DISTANCE_BETWEEN_POINTS);
Vector curPos = prevPos;
for (int i = 0; i < pointsToInsert; i++)
{
curPos += vecFromPrev / pointsToInsert;
it = points_.insert(it, PathPoint(curPos, false));
it++;
}
}
}
【问题讨论】:
-
我觉得不错。虽然我会做一些事情来明确
Vector不是std::vector<t>。 -
您将
it增加两次,但未检查它是否有效。 -
其实我不是。在循环内部,我的迭代器将始终指向有效的列表元素。然而,迭代器的移动有点疯狂,这也是我对我的代码不太满意的原因之一。
-
在循环定义中,您在不知道其有效性的情况下执行一次。如果您的列表为空,
++points_.begin()就会爆炸。