2016-06-02 3 views
1

私はリストにイテレータを格納しています:私のアルゴリズムで妥当性::前とstd ::次のstd ::リスト

list<int> l; 
l.push_back(21); l.push_back(1); l.push_back(31); l.push_back(41); 

auto it = l.find(21); 

、私はノードを削除するたびに、私は追加する必要があります隣接要素。このようなもの:

auto prev = std::prev(it); 
auto next = std::next(it); 
*prev = *prev + *next; 
l.erase(it); 

ご覧のとおり、すべての境界条件を保証する必要があります。 std::prev()std::next()の値は次の場合に返されます。

  • これらは最初と最後の要素です。
  • またはitそのものがある時点で無効になった場合は、 std::prev()std::next()リターンを何値

答えて

5

...

彼らはイテレータitn番目(ここでnデフォルトは1)に先行または後続を返します。 [iterator.operations]/6と/ 7についてはこちらをご覧ください。

...最初と最後の要素である場合。またはある時点でit自体が無効になった場合はどうなりますか?

呼び出しが行われる前にイテレータを有効にする必要があります。 itが対応する境界イテレータの1つである場合、戻り値は無効なイテレータになります。すなわちit == begin()prev(it)であり、it == end()next(it)です。

itの妥当性は、prev()またはnext()の引数として使用される前に確立する必要があります。 std::prev()std::next()は、イテレータのデクリメントまたはインクリメントがイテレータをコンテナの境界の外側に置くかどうかを判断する理由がありません。

このように、アルゴリズムの消去部分で2つの境界条件をコーディングする必要があるようです。最初はit == l.begin()となり、2番目の場合はit == prev(l.end())となり、要素が見つからない場合は3番目の要素になります(したがってit == l.end())。

// only proceed it something is found... 
if (it != l.end()) { 
    if (it == l.begin()) { 
    // nothing to do...? element removed is the first one 
    } 
    else if (it == std::prev(l.end()) { 
    // nothing? element removed is the last one.... 
    } 
    else { 
    auto prev = std::prev(it); 
    auto next = std::next(it); 
    *prev = *prev + *next; 
    } 
    l.erase(it); // remove the found element... 
} 
関連する問題