【问题标题】:Taking iterators two at a time?一次使用两个迭代器?
【发布时间】:2010-11-25 19:11:37
【问题描述】:

我会经常这样表示和处理折线:

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;
}

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

【问题讨论】:

    标签: c++ containers iterator


    【解决方案1】:

    我会保留两个迭代器,然后检查第二个迭代器是否到达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;
    }
    

    【讨论】:

    • 我认为您需要测试该行是否为空,否则您将遇到问题。
    • 原代码也有同样的问题。所以我假设多边形对象不能为空。但我同意你的观点,处理空行容器可能也是一个好主意。
    【解决方案2】:

    --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;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-05
      • 2018-06-10
      • 1970-01-01
      • 2012-08-10
      • 2019-08-24
      • 2014-10-16
      • 2011-09-01
      • 1970-01-01
      相关资源
      最近更新 更多