2009-09-04 168 views
0

我會經常代表和工藝折線像這樣:每次兩個迭代器?

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

有沒有表達這種更簡潔的方式用迭代器進行兩次處理?

回答

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

我認爲你需要測試如果行是空的,否則你會有問題。 – 2009-09-05 00:46:03

+0

原始代碼有同樣的問題。所以我認爲多邊形對象不能爲空。但我同意你的看法,處理空行容器也是一個好主意。 – 2009-09-05 01:06:57

1

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