Как удалить из `forward_list` последний положительный элемент?

Как удалить из forward_list последний положительный элемент?

#include<iostream>
#include<forward_list>
#include<string>

using namespace std;

void ViewList(forward_list<int> L)
{
    forward_list<int>::iterator a;
    if (L.empty())
    {
        cout << "List is empty!" << endl;
        return;
    }
    else
    {
        for (a = L.begin(); a != L.end(); a++)
        {
            cout << *a << "  ";
        }
    }
}

int main()
{
    size_t size = 0;
    forward_list<int> L;
    cout << "Enter elements of list or 'stop' to continue: ";
    string e;
    cin >> e;
    while (e != "stop")
    {
        L.push_front(stoi(e));
        size++;
        cin >> e;
    }
    ViewList(L);
    system("pause");
    return 0;
}

Ответы (1 шт):

Автор решения: avp

(Приношу изинения за невнимательность, первый вариант был для удаления элемента, предшествующего последнему положительному в списке)

Для удаления элемента из forward_list существует функция .erase_after(), в которую надо передать итератор.

Функция, решающая вашу задачу, просматривет список и постоянно запоминает итератор на элемент, предшествующий текущему (проверяемому, что он положительный). При нахождении положительного элемента итератор на предыдущий запоминается отдельно.

Функция возвращает итератор на удаленный из списка элемент, если положительных элементов нет, то возвращаем итератор .before_begin()

forward_list<int>::iterator
remove_last_positive (forward_list<int> &lst)
{
  auto ie = lst.before_begin(), // remove after this
    cur = lst.begin(),          // current list element
    ip = ie,                    // any before cur
    irm = ie;                   // element to remove (return it)

  int remfl = 0;                // flag, that positive element is found

  while (cur != lst.end()) {
    if (*cur > 0) {
      remfl = 1;
      ie = ip;
    }
    ip = cur++;
  }

  if (remfl)
     irm = next(ie), lst.erase_after(ie);

  return irm;
}
→ Ссылка