@AlphaScript

Ошибка при удалении элемента. Как удалить элемент из списка в C++?

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

Вот код удаления:
for (auto it = myList.begin(); it != myList.end();)
{
	if (*it == 7)
		it = myList.erase(it);
	else
		++it;
}

Например, myList = { 4, 5, 6, 7, 8, 10, 11 }, после удаления 7, myList будет такой { 4, 5, 6, 8, 10, 11, 11 }

Заранее спасибо за помощь.
P.S. Не судите строго, только начинаю работать с STL, и совсем недавно пишу на С++ - лучше подскажите как лучше.
  • Вопрос задан
  • 663 просмотра
Решения вопроса 1
myjcom
@myjcom Куратор тега C++
spoiler
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;

template<typename Container, typename value>
bool remove_value(Container& c, value v)
{
    if(auto it{find(begin(c), end(c), v)}; it != end(c))
    {
        c.erase(it);
        return true;
    }
    return false;
}

int main()
{
    list<int> myList {1,2,3,4,5,6,7,8,9,10};
    
    //myList.erase(std::remove(myList.begin(), myList.end(), 7));
    
    /*if(auto it{find(myList.begin(), myList.end(), 7)}; it != myList.end())
    {
        myList.erase(it);
    }*/
       
    if(int value = 7; remove_value(myList, value))
    {
        cout << "removed value: " << value << endl;
    }
    else
    {
        cout << "value: " << value << " not found" << endl;
    }

    for(int v:myList)
    {
        std::cout << v << ' ';
    }
}

g++ -std=c++1z

Вы контейнерами STL пользуетесь... для них алгоритмы есть.
www.cplusplus.com/reference/algorithm
https://en.cppreference.com/w/cpp/algorithm
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы