Cześć, potrzebuję pomocy w napisaniu kodu, który będzie przenosił elementy pomiędzy x i y na koniec listy. Na początku znajdujemy x na liście jeżeli jest x dopiero szukamy y. Liczby które są między x,y przenosimy na koniec listy. List za bardzo nie znam więc mam pewne problemy z napisaniem tego. Myślałem nad 2 rozwiązaniami. 1 - elementy między x i y, przenieść na drugą liste, i z pierwszej je usunąć, po czym połączyć obie listy. 2 - przenosić jeden po drugim elementy na koniec listy.
Czy takie rozwiazanie jest poprawne ?
void moveEnd(list<int> &listOfNumbers, int x, int y) {
auto itX = find(listOfNumbers.begin(), listOfNumbers.end(), x);
if (itX != listOfNumbers.end()) {
auto itY = find(itX, listOfNumbers.end(), y);
itX++;
for (list<int>::iterator i = itX; i != itY; ++i) {
listOfNumbers.push_back(*i);
}
listOfNumbers.erase(itX, itY);
}
}
Zmieniłem już na numbers, poza tym reszta dobrze ?
Nie. Użyj std::rotate
.
Przy okazji lektura:
void moveEnd(list<int> &numbers, int x, int y) {
auto itX = find(numbers.begin(), numbers.end(), x);
if (itX != numbers.end()) {
auto itY = find(itX, numbers.end(), y);
itX++;
rotate(itX,itY,numbers.end());
}
}
Nie wiem co ma się dziać jeśli znajdziesz x, a y nie. Ale poza tym wygląda ok.
Jeszcze takie pytanie, muszę znaleźć największą wartość na liście i przenieść ją na koniec.
auto max = max_element(numbers.begin(),numbers.end());
tak znalazłem maxa, chciałem użyć rotate, ale nie za bardzo działa
Oraz zamienić 1 element z ostatnim
Rotate powinno działać. Pokaż kod.
Jeżeli dobrze zrozumiałem jak działa rotate, 2 pierwsze parametry to zakres od do, a ostatni wskazuje miejsce gdzie ma się zaczynać element first, tak ?
auto i1 = max_element(numbers.begin(),numbers.end());
rotate(i1,i1,numbers.end());
auto i1 = max_element(numbers.begin(),numbers.end());
if(i1 != numbers.end())
rotate(i1,std::next(i1),numbers.end());
koncepcyjne, rotate(p1, p2, p3) zamienia miejscami [p1, p2) i [p2, p3)
a żeby zamienić miejscami 1 z ostatnim elementem, można do tego użyć rotate czy jest lepsza funkcja
std::swap(numbers.front(), numbers.back())
(zakładając że lista nie jest pusta)
Dziękuje
Myśle, że twojej pięknej Pani wykładowczyni chodziło o to lub Panu.