C++ 一次使用两个迭代器?

C++ 一次使用两个迭代器?,c++,containers,iterator,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 l

我通常会这样表示和处理多段线:

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::vectorPolyline\u t;
双多段线长度(常数多段线和直线)
{
双透镜=0.0;
对于(size_t i=0;i
我想到的最直接的双向迭代器转换是:

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;
}
typedef std::listPolyline\u t;
typedef Polyline_t::常量迭代器Polyline_t_cit;
双多段线长度(常数多段线和直线)
{
双透镜=0.0;
Polyline_t_cit last=line.end();
最后--;
对于(Polyline_t_cit i=line.begin();i!=last;++i)
{
常数点t&beg=*i;
常数点T&end=*(++i);
len+=(end-beg).length();
--一,;
}
回程透镜;
}

有没有一种更简洁的方法来用迭代器表示这种一次两个的处理方式?

我会保留两个迭代器,然后检查第二个迭代器是否已到达
末尾。这将使它不再需要双向迭代器:

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;
}
typedef std::listPolyline\u t;
typedef Polyline_t::常量迭代器Polyline_t_cit;
双多段线长度(常数多段线和直线)
{
双透镜=0.0;
多段线f=line.begin(),s(f),end=line.end();
对于(++s;s!=end;++f,++s){
len+=(*s-*f).length();
}
回程透镜;
}
--i
紧跟在
++i
之前-两者都是不必要的

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; )
    {
        const Point_t& beg = *i;
        const Point_T& end = *(++i);
        len += (end - beg).length();
    }
    return len;
}
typedef std::listPolyline\u t;
typedef Polyline_t::常量迭代器Polyline_t_cit;
双多段线长度(常数多段线和直线)
{
双透镜=0.0;
Polyline_t_cit last=line.end();
最后--;
对于(Polyline_t_cit i=line.begin();i!=last;)
{
常数点t&beg=*i;
常数点T&end=*(++i);
len+=(end-beg).length();
}
回程透镜;
}

我认为您需要测试行是否为空,否则会有问题。原始代码也有同样的问题。所以我假设多边形对象不能为空。但我同意你的观点,处理空行集装箱可能也是个好主意。