イテレータをリストに保存しています:
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()
返すか...
イテレータのn
th(n
デフォルトは1)の先行または後続を返しますit
。[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...
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加