Мне не нравится упоминать типы итераторов, потому что 1.) они довольно уродливы и 2.) они уменьшают изменения, которые я должен внести, если я изменю типы коллекций, поэтому я, вероятно, сделал бы что-то подобное .. ..
Я сделал пару дополнительных настроек, которые, вероятно, больше относятся к моему личному стилю, чем к идиоматическим.
this->addAdditionalPoints(points.begin(), points.end());
template<typename InIt>
void MyClass::addAdditionalPoints(InIt start, InIt finish)
{
InIt it = start;
++it; // Starting with second element
for (; it != finish; ++it) // I usually pre-increment iterators, but
// it probably doesn't matter.
{
InIt curr = it; // Work with a temp rather than loop index
Vector curPos = curr->getPosition();
Vector prevPos = (--curr)->getPosition();
Vector vecFromPrev = curPos - prevPos;
float distance = vecFromPrev.abs();
++curr; // Prefer to pre-increment iterators
if (distance > MAX_DISTANCE_BETWEEN_POINTS)
{
int pointsToInsert = static_cast<int>(distance /
MAX_DISTANCE_BETWEEN_POINTS); // I prefer C++-style casts
Vector curPos = prevPos;
for (int i = 0; i < pointsToInsert; i++)
{
curPos += vecFromPrev / pointsToInsert;
curr = points_.insert(curr, PathPoint(curPos, false));
++curr; // Again I prefer to pre-increment iterators
}
}
}
}