std :: listに対するstd :: prevおよびstd :: nextの有効性

RAM

イテレータをリストに保存しています:

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()返すか...

イテレータnth(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]

編集
0

コメントを追加

0

関連記事

分類Dev

std :: string_viewおよびstd :: stringのstd :: unordered_set

分類Dev

Clang、std :: next、libstdc ++およびconstexpr-ness

分類Dev

std :: unique_ptrおよびstd :: shared_ptrの所有権を取得する方法

分類Dev

std :: bindおよび右辺値の参照

分類Dev

std :: threadおよび右辺値の参照

分類Dev

boost :: any_castおよびstd :: optionalの

分類Dev

GCC4.9およびclang3.5のstd :: rbeginおよびstd :: rend関数

分類Dev

整数型のstd :: isnanおよびstd :: isinfの過負荷

分類Dev

std :: lower_boundおよびstd :: upper_boundの根拠?

分類Dev

std :: make_index_sequenceおよびstd :: index_sequenceの詳細

分類Dev

std :: string :: reserved()およびstd :: string :: clear()の難問

分類Dev

std :: ptrdiff_tおよびstd :: size_tの奇妙なtypedef

分類Dev

std :: basesおよびstd :: direct_basesのステータス

分類Dev

std :: copyおよびstd :: vector :: assignの変換警告

分類Dev

C ++ 17 std :: from_charsおよびstd :: to_charsの目的は?

分類Dev

std :: functionおよびstd :: bindの戻り値

分類Dev

std :: visitおよびstd :: variantの使用法

分類Dev

std :: unique_ptrおよびstd :: ostringstream(SIGSEGV)の奇妙な動作

分類Dev

型付きstd :: arrayでのnewおよびstd :: destroy_atの配置の安全性?

分類Dev

std :: bindをstd :: functionおよびstd :: mapと一緒に使用する方法

分類Dev

std :: listをstd :: listのベクトルに追加する

分類Dev

std :: vector :: emplace_backおよびstd :: move

分類Dev

std.algorithm.copyおよびstd.digest

分類Dev

std :: Experimental :: ostream_joinerおよびstd :: pair

分類Dev

std :: bindおよびstd :: function with polymorphism、base class

分類Dev

std :: bindおよびstd :: weak_ptr

分類Dev

std :: enable_ifおよびstd :: shared_ptr

分類Dev

std::initializer_list が std::get<>、std::tuple_size および std::tuple_element をサポートしないのはなぜですか

分類Dev

std :: setと文字列キーおよび潜在的な効率の低下

Related 関連記事

  1. 1

    std :: string_viewおよびstd :: stringのstd :: unordered_set

  2. 2

    Clang、std :: next、libstdc ++およびconstexpr-ness

  3. 3

    std :: unique_ptrおよびstd :: shared_ptrの所有権を取得する方法

  4. 4

    std :: bindおよび右辺値の参照

  5. 5

    std :: threadおよび右辺値の参照

  6. 6

    boost :: any_castおよびstd :: optionalの

  7. 7

    GCC4.9およびclang3.5のstd :: rbeginおよびstd :: rend関数

  8. 8

    整数型のstd :: isnanおよびstd :: isinfの過負荷

  9. 9

    std :: lower_boundおよびstd :: upper_boundの根拠?

  10. 10

    std :: make_index_sequenceおよびstd :: index_sequenceの詳細

  11. 11

    std :: string :: reserved()およびstd :: string :: clear()の難問

  12. 12

    std :: ptrdiff_tおよびstd :: size_tの奇妙なtypedef

  13. 13

    std :: basesおよびstd :: direct_basesのステータス

  14. 14

    std :: copyおよびstd :: vector :: assignの変換警告

  15. 15

    C ++ 17 std :: from_charsおよびstd :: to_charsの目的は?

  16. 16

    std :: functionおよびstd :: bindの戻り値

  17. 17

    std :: visitおよびstd :: variantの使用法

  18. 18

    std :: unique_ptrおよびstd :: ostringstream(SIGSEGV)の奇妙な動作

  19. 19

    型付きstd :: arrayでのnewおよびstd :: destroy_atの配置の安全性?

  20. 20

    std :: bindをstd :: functionおよびstd :: mapと一緒に使用する方法

  21. 21

    std :: listをstd :: listのベクトルに追加する

  22. 22

    std :: vector :: emplace_backおよびstd :: move

  23. 23

    std.algorithm.copyおよびstd.digest

  24. 24

    std :: Experimental :: ostream_joinerおよびstd :: pair

  25. 25

    std :: bindおよびstd :: function with polymorphism、base class

  26. 26

    std :: bindおよびstd :: weak_ptr

  27. 27

    std :: enable_ifおよびstd :: shared_ptr

  28. 28

    std::initializer_list が std::get<>、std::tuple_size および std::tuple_element をサポートしないのはなぜですか

  29. 29

    std :: setと文字列キーおよび潜在的な効率の低下

ホットタグ

アーカイブ