我经常会像这样表示和处理折线:
typedef std::vector< Point_t > Polyline_t;
double PolylineLength(const Polyline_t& line)
{
double len = 0.0;
for( size_t i = 0; i < line.size()-1; ++i )
len += (line[i+1]-line[i+0]).length();
return len;
}
我想出的最直接的双向迭代器转换是:
typedef std::list< Point_t > Polyline_t;
typedef Polyline_t::const_iterator Polyline_t_cit;
double PolylineLength(const Polyline_t& line)
{
double len = 0.0;
Polyline_t_cit last = line.end();
last--;
for( Polyline_t_cit i = line.begin(); i != last; ++i )
{
const Point_t& beg = *i;
const Point_T& end = *(++i);
len += (end - beg).length();
--i;
}
return len;
}
是否有更简洁的方式用迭代器表达这种两次处理?
答案 0 :(得分:8)
我会保留两个迭代器,然后检查第二个迭代器是否已达到end
。这将使它不再需要双向迭代器:
typedef std::list< Point_t > Polyline_t;
typedef Polyline_t::const_iterator Polyline_t_cit;
double PolylineLength(const Polyline_t& line)
{
double len = 0.0;
Polyline_t_cit f = line.begin(), s(f), end = line.end();
for(++s; s != end; ++f, ++s) {
len += (*s - *f).length();
}
return len;
}
答案 1 :(得分:1)
--i
- 两者都是不必要的。
++i