Przenoszenie elementów na koniec listy

0

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.

0

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);
    }
}
0

Zmieniłem już na numbers, poza tym reszta dobrze ?

2

Nie. Użyj std::rotate.

Przy okazji lektura:

0
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());
    }
}
1

Nie wiem co ma się dziać jeśli znajdziesz x, a y nie. Ale poza tym wygląda ok.

0

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

0

Rotate powinno działać. Pokaż kod.

0

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 ?

0
auto i1 = max_element(numbers.begin(),numbers.end());
    rotate(i1,i1,numbers.end());
1
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)

0

a żeby zamienić miejscami 1 z ostatnim elementem, można do tego użyć rotate czy jest lepsza funkcja

1

std::swap(numbers.front(), numbers.back()) (zakładając że lista nie jest pusta)

0

Dziękuje

0

Myśle, że twojej pięknej Pani wykładowczyni chodziło o to lub Panu.

title

1 użytkowników online, w tym zalogowanych: 0, gości: 1