Как удалить из `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 шт):
(Приношу изинения за невнимательность, первый вариант был для удаления элемента, предшествующего последнему положительному в списке)
Для удаления элемента из 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;
}