一次两个迭代器?

gen*_*ult 0 c++ containers iterator

我经常代表和处理折线,如下所示:

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;
}
Run Code Online (Sandbox Code Playgroud)

我提出的最直接的双向迭代器转换是:

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;
}
Run Code Online (Sandbox Code Playgroud)

是否有更简洁的方式来表示这种使用迭代器的两次处理?

Joh*_*itb 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;
}
Run Code Online (Sandbox Code Playgroud)