List C++ Удаление конкретного элемента List

196
28 ноября 2017, 22:36

Нужно удалить второй элемент из list. Все работает как надо. Но если я создаю функцию: И вызываю её, то ничего не происходит. Почему это так, и как это исправить?

auto delete_list_elem(list<int> list1, int k)
{
   int i=0;
   list<int>::iterator it = list1.begin();
   while(i<=k)
   {
     if(i==k)
      {
        cout << *it << " ";
        return list1.remove(*it);
        cout<<"\n deleted"<<endl;
      }
      it++;
     i++;
    }
}
#include <iostream>
#include <list>     
#include <iterator> 
#include <ctime>
#include <cstdlib>
#include <algorithm>
using namespace std;
int main()
{
   list<int> myList; 
   for(int i = 0; i < 15; i++)
   {
       myList.push_back(rand()%20); 
   }
   cout << "Список: ";
   for ( list<int>::iterator it = myList.begin(); it != myList.end(); it++)
   {
    cout << *it << " ";
   }
   cout << "\n max: " << *max_element(myList.begin(),myList.end()) << endl;

   int i=0;
   int k=2; // удаление второго элемента
   list<int>::iterator it = myList.begin();
   while(i<=k)
   {
     if(i==k)
      {
        cout << *it << " ";    /// не работает при заносе в функцию
        myList.remove(*it);
        cout<<"\n deleted"<<endl;
      }
      it++;
     i++;
    }
   //delete_list_elem(myList,2);
  for ( list<int>::iterator it = myList.begin(); it != myList.end(); it++)
   {
    cout << *it << " ";
   } 

   return 0;
}

**Update: ** Проблема решена, решение в моем ответе ниже.

Answer 1
auto delete_list_elem(list<int>& list1, int k) // <--- Тут & появился
{
   list<int>::iterator it = list1.begin();
   std::advance(it, k); // <-- advance итерирует переданный итератор на k позиций
   if (it != list1.end()) 
   {
       return list1.erase(it); // <--- Вернет итератор на k+1 элемент, перед it нет *
   }
   return it; // k больше размера списка, дефакто равет end()
}
Answer 2

Update: Всем спасибо, спросил у преподавателя, он внёс правки и все работает. Код:

list<int> delete_list_elem(list<int> list1, int k)
{
   int i=0;
   list<int>::iterator it = list1.begin();
   while(i<=k)
   {
     if(i==k)
      {
        cout << *it << " ";
        list1.remove(*it);
        cout<<"\n deleted"<<endl;
      }
      it++;
     i++;
    }
    return list1;
}
**И данная строка была добавлена в код основной программы:** 

myList = delete_list_elem(myList,2);

READ ALSO
Структурирование данных JAVA

Структурирование данных JAVA

Необходимо реализовать программу, в которой будут использоваться все модификаторы доступы - private, default, protected, public на трех уровнях наследованияТакже...

217
Потоки.InputStream.Java.Как работать с данными

Потоки.InputStream.Java.Как работать с данными

Есть архив в нем набор файлов, надо считать файлы из архива и выборочно брать один из них, разархивировать архив на диск не нужно, хотел подгружать...

428
Не срабатывает timeout в Completable.fromAction()

Не срабатывает timeout в Completable.fromAction()

Добрый деньСтолкнулся с ошибкой, что при блокирующем ожидании завершения работы Completable, созданного при помощи

244
Разбиение чисел на цифры

Разбиение чисел на цифры

Сосчитать сумму цифр, при этом умножая каждую цифру на её порядковый номер (позицию) в числе, считая слева, начиная с единицыНапример 1567 - получается...

330