здраствуйте, есть список с элементов класса
код класса:
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
подскажите как удалять элементы в моем случае или поправьте если я где то допустил ошибку
Мне кажется, что лучше использовать 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)
и короче, и эффективнее?
сделал так и все работает, если кому нужно будет
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);
}
скорее всего проблема была в лишних проходах и лишних удалениях соответственно
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости