Ich habe eine Menge Probleme mit List-Iteratoren, und ich habe vorher eine Frage gestellt, konnte aber nicht die Lösung finden, die ich suchte.Wie wiederhole ich eine Liste und lösche sie?
Ich habe eine kreisförmige Liste, und ich muss den Wert von Knoten n durch Knoten n + ersetzen (Schritt). Ich muss dann Knoten n + (Schritt) löschen. Wenn ich es lösche, setzt der Iterator auf das Element nach dem gelöschten Element. Ich brauche den Iterator zurück am Knoten n. Wie zum Teufel kann ich das tun, weil jedes Mal, wenn ich n + (Schritt) lösche ich einen ungültigen Iterator bekomme. Meine Eingabe ist 5 und 2.
Bitte lassen Sie mich wissen, wenn es eine bessere Datenstruktur mit dies zu tun, wenn es keine Möglichkeit gibt, von einer Liste zu iterieren und zu löschen. Ich dachte an einen Vector, aber ich würde Elemente verschieben müssen, und das wäre teuer, wenn es viele Elemente gibt.
#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;
}
advanceList
#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;
}
Frage sieht wie Hausaufgaben mit missverstandener Problemaussage aus. Löschen von Vektor von leicht beweglichen Objekten (Uint) in nicht langsam. Es geht sowieso nicht darum, von der Liste zu entfernen. Ihr Code ist voller Fehler ohne ihn. In jeder Iteration Ihrer Schleife gehen Sie zweimal "Schritt" -Positionen vor. Code, der an die richtige Stelle zurückkehrt, geht davon aus, dass Elementwerte eindeutig sind. Was sollte Ihr "n" sein, nachdem Sie die Operation durchgeführt haben? – Muxecoid
Ich endete mit einem Vector. Danke, dass du mich informiert hast, dass es nicht langsam war. – Taztingo