удаления из списка элементов класса list<classT> С++

266
10 ноября 2017, 09:40

здраствуйте, есть список с элементов класса
код класса:

class file_data
{
public:
string name;
string date;
int count;
file_data(string _name = " ", string _date = " ", int _count = 0)
{
    name = _name;
    date = _date;
    count = _count;
}
void set_name(string _name){ name = _name; }
void set_date(string _date){ date = _date; }
void set_count(int _count){ count = _count; }
string get_name(){ return name; }
string get_date(){ return date; }
int get_count(){ return count; }
friend ostream& operator<<(ostream& os, file_data& fd)
{
    cout << "Назва файлу: " << fd.name << endl;
    cout << "Дата створення: " << fd.date << endl;
    cout << "Кількість звернень: " << fd.count << endl;
    return os;
}
};

оформлен так:

list<file_data> lst; 

а так же итератор для него:

list<file_data>::iterator iter;

еще есть временный элемент класса

file_data tmp;

так вот при попытке удаления элементов таким образом(код ниже) пишет что бинарный "==": не найден оператор, принимающий левый операнд типа "file_data" (или приемлемое преобразование отсутствует)

file_data remove;
for (int i = 0; i < 6; i++)
{
    for (iter = lst.begin(); iter != lst.end(); iter++)
    {
        tmp = *iter;
        if (tmp.date < user_date) remove = tmp;
    }
    lst.remove(remove);
}

сперва пробывал в одном цыкле, так же ошыбка и решил, что лучше за цыклом удалять, но если сделать так

list<file_data>::iterator remove;
for (int i = 0; i < 6; i++)
{
    for (iter = lst.begin(); iter != lst.end(); iter++)
    {
        tmp = *iter;
        if (tmp.date < user_date) remove = iter;
    }
    lst.erase(remove);
}    

то программа компилируется, но во время выполнения операции идет прерывания и пишет list iterator not incrementable
подскажите как удалять элементы в моем случае или поправьте если я где то допустил ошибку

Answer 1

Мне кажется, что лучше использовать list::remove_if -

lst.remove_if([user_date](const file_data& f){f.date < user_date});

В любом случае, непонятно, зачем вы копируете:

tmp = *iter;
if (tmp.date < user_date)

Если

if (iter->date < user_date)

и короче, и эффективнее?

Answer 2

сделал так и все работает, если кому нужно будет

list<file_data>::iterator remove;
bool del = true;
while (del)
{
    for (iter = lst.begin(); iter != lst.end(); iter++)
    {
        tmp = *iter;
        del = false;
        if (tmp.date < user_date)
        {
            remove = iter; 
            del = true;
        }
    }
    if (del) lst.erase(remove);
}

скорее всего проблема была в лишних проходах и лишних удалениях соответственно

READ ALSO
Вывод данных из БД в TableView(Qt)

Вывод данных из БД в TableView(Qt)

Здравствуйте, стал изучить работу с БД в Qt creator

501
Указатель this c++

Указатель this c++

Добрый вечерУ меня такой вопрос, недавно лазил в инете и наткнулся на такой код: return*this*Fraction(fra

328
Проверка введенных данных QTableWidget

Проверка введенных данных QTableWidget

Доброго времени суток коллегиЕсть задача используя QTableWidget проверять введенные пользователем данные в ячейки с помощью нехитрой конструкции

264
Ошибки в библиотеке GLM (C++ Builder)

Ошибки в библиотеке GLM (C++ Builder)

При подключении библиотеки GLM возникают ошибки:

289