Listイテレータで問題が発生しています。以前は質問しましたが、私が探していた解決策を手に入れることができませんでした。リストを反復して削除するにはどうすればいいですか?
私は循環的なリストを持っており、ノードnの値をノードn +(ステップ)に置き換える必要があります。私はノードn +を消去しなければならない(ステップ)。消去すると、消去された要素の後の要素にイテレータが配置されます。ノードnにイテレータを戻す必要があります。何度もn +を消去するたびに(ステップ)無効なイテレータが得られます私の入力は5と2です。
リストを反復して消去する方法がない場合、これを行うためのより良いデータ構造があるかどうか教えてください。私はVectorを使うことを考えましたが、要素をシフトさせなければならず、多くの要素があればコストがかかります。
#include "roulette.h"
#include <iostream>
uint roulette(uint people, uint step)
{
std::list<uint>::iterator iterator;
for(uint i = people; i > 0; i--)
gl_myList.push_front(i);
iterator = gl_myList.begin();
while(people > 1)
{
iterator = advanceList(iterator, step - 1);
uint replaceValue = *iterator; // Node n's value
auto tempIterator = advanceList(iterator, step);
uint newValue = *tempIterator; //Node n + step value
iterator = gl_myList.erase(tempIterator);
//Makes it past the erase function ONCE.
//Puts the iterator back to the correct spot, and sets it value
while(*iterator != replaceValue)
{
advanceList(iterator, 1);
}
*iterator = newValue;
people--;
}
return *iterator;
}
あなたは正しくerase()
呼び出しの結果を使用していない、またあなたが.end()
前に次の反復のためにチェックしている
#include "roulette.h"
std::list<uint>::iterator advanceList(std::list<uint>::iterator& start, uint step)
{
for(uint i = 0; i < step; i++)
{
start++;
if(start == gl_myList.end())
{
start = gl_myList.begin();
}
}
return start;
}
問題は誤解された問題文で宿題のように見えます。 動きの遅いオブジェクト(uint)のベクトルからゆっくりと消去します。とにかくリストから削除することではありません。あなたのコードにはバグがありません。 ループの各繰り返しで、「ステップ」ポジションを2回進めます。正しいスポットに戻すコードは、要素値が一意であると仮定します。 操作を実行した後、 "n"にする必要があるのは何ですか? – Muxecoid
私はVectorを使ってしまった。遅くはないことを教えてくれてありがとう。 – Taztingo