list::erase
(最後に)消去された要素の後の要素にイテレータを返し、イテレータlist::insert
を渡す要素の前に挿入するため、ニーズに最適です:
using namespace std;
void recursiveFunction(list <int> &jobs,...){
//...
for(auto i = begin(jobs); i != end(jobs);){
//...
auto tmpElem = *i;
i = jobs.erase(i);
recursiveFunction(jobs,...);
jobs.insert(i,tmpElem);
}
}
ノート:
i=jobs.erase(i)
あなたと効果的に増加しますi
。したがって、インクリメントを for ループに残します。代わりi=jobs.insert(i,tmpElem)
に後で使用するためi
、同じ要素を再度指します
i
適切なスタイルと保守性の問題として、変数 ( 、 などtmpElem
) をできるだけローカルに宣言します。
- 変数に意味のある名前を付ける
関数が何をするかに応じて、あなたが望むものを達成するための他の可能性があるかもしれません。このようにして、リスト要素の各サブセットで作業し、それらの多くで複数回作業します。リストに content が含まれていると考えてください。{1,2,3}
何が起こるか (疑似コード):
recursiveFunction({1,2,3},...)
for-loop, i = &1
erase(1)
recursiveFunction({2,3},...)
for-loop, i = &2
erase(2)
recursiveFunction({3},...) //a
insert(2)
//...
insert(1)
for-looop, i = &2
erase(2)
recursiveFunction({1,3},...)
for-loop, i = &1
erase(1)
recursiveFunction({3},...) //b
insert(1)
//...
insert(2)
//...
行 a と b は同じように見えますが、追加のパラメーターは同じではない可能性があります。コードからはわかりません。ですから、それを念頭に置いて、これがあなたが本当に望んでいるものかどうかを検討してください.