std::forward_list
は、forward_iteratorsを持つシーケンシャルコンテナです。これは片側の単独リンクリストです。値をリストに挿入するには、メソッドinsert_after
のみを使用して、[begin(), end())
の範囲内のイテレータを指定するか、before_begin()
メソッドによって返されるイテレータを使用します。 C++規格から
5要件:位置before_begin()又は範囲内dereferenceable イテレータである[()、終了())を開始します。
リストの最後に新しい値を追加する場合は、リストの最後の要素に対応する位置にイテレータを移動する必要があります。
だから、このループは、名前付き範囲ベースのforループ
for (auto& _ : obj)
++b_end ;
移動は、リストの最後の要素によって占められる位置にステップ反復子b_end
ステップ。今度はイテレータを使用して、insert_after
というメソッドを使用してリストに新しい値を追加できます。
簡単なデモンストレーションプログラムを考えてみましょう。
#include <iostream>
#include <forward_list>
int main()
{
std::forward_list<int> lst = { 1, 2 };
auto b_end = lst.before_begin();
for (const auto &_ : lst)
{
++b_end;
std::cout << *b_end << '\n';
}
std::cout << std::endl;
lst.insert_after(b_end, 3);
for (const auto &_ : lst) std::cout << _ << ' ';
std::cout << std::endl;
return 0;
}
プログラムの出力は、リストの最初の要素の前に最初のイテレータb_end
ポイントで
1
2
1 2 3
あります。リストが2つだけの要素が含まれているため、最初にイテレータが最初の要素に対応する位置に、次いで、第二に対応する位置に移動される2回の反復を有することになるループにおけるその後
auto b_end = lst.before_begin();
^^^^^^^^^^^^^^
素子。今、私たちはそれが[範囲ベースのforループ](http://en.cppreference.com/w/cpp/language/rangeと呼ばれる値2
後の値3を追加することができます得たイテレータを使用して
-for) – rustyx
私は完全なコードを投稿することはできませんが、コードの目的は、リストの最後にnewObjを常に挿入することです(技術的には最後ではなく、終わりの前にnullptrを指すかもしれませんか?) – Jin
@Jin:A [mcve]は完全なコードではありません。それはおもちゃの例を作り、あなたが見る行動を再現することです。デバッグと理解のための非常に便利な演習です。 – AndyG