3

私のコードの基本的な構造は次のとおりです。

using namespace std;
void recursiveFunction(list <int> &jobs,...){
list<int>::iterator i;
int ii;
//code missing
    for(i=jobs.begin(); i != jobs.end(); ++i){
        //more code missing
        list<int>::iterator tempi(i);
        ii=*i;
        jobs.erase(tempi);
        recursiveFunction(jobs,...);
        jobs.insert(i,ii);
    }
}

私が発見したように、消去された位置を指すポインターは無効になるため、 i が無効になります。この方法でジョブ番号を再挿入する方法はありますか? 再帰ごとに新しいリストを作成するというパフォーマンス ヒットがなければ?

おそらく、リスト反復子以外のものを使用する方法はありますか?

4

2 に答える 2

7

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 は同じように見えますが、追加のパラメーターは同じではない可能性があります。コードからはわかりません。ですから、それを念頭に置いて、これがあなたが本当に望んでいるものかどうかを検討してください.

于 2013-06-18T07:21:30.977 に答える
0

再帰は、問題に適したツールではないようです。{ 1, 2, 3, 4 } を含むリストがあり、3 つすべてが該当する場合、次のようになります。

再帰 ({1,2,3,4});
  it.1 = (1)
  削除 1
  再帰 ({2,3,4});
    it.2 = (2)
    削除 2
    再帰 ({3,4});
      it.3 = (3)
      削除 3
      再帰 ({4});
        it.4 = (4)
        削除 4
        再帰({})
        再挿入 4 ({4})
      再挿入 3 ({3,4})
      it.3 = (4)
      削除 4
      再帰 ({3});
        it.4 = (3)
        削除 3
        再帰({})
        再挿入 3 ({3})
      再挿入 4 ({3,4})
    再挿入 2 ({2,3,4})
    it.2 = (3)
    3 を削除 ({2,4})
...など...
于 2013-06-18T07:22:37.203 に答える