1 / 1 / 4
Регистрация: 05.11.2016
Сообщений: 64
1

Std::list Удалить элемент если тип списка собственный класс

17.09.2017, 14:10. Показов 2015. Ответов 7
Метки нет (Все метки)

Подскажите как удалить нужный элемент! И неплохо бы было узнать как обращаться к полям объекта в списке

C++
1
2
3
4
5
6
7
8
9
list <Abonent> l1,l2;
    Abonent obama213("Пупкин","Поток","Чудненко","330216","12345","12.12.2017","Оплачено",150,"11.11.2015");
    Abonent obama214("Васькин","Октябрьский","Чудненко","771144","54321","12.11.2015","Неоплачено",120,"10.10.2014");
    Abonent obama215("Боб","Поток","Малахова","290874","007","1.1.1998","Оплачено",12000,"15.15.1950");
void DeleteAbonent(string named)
{   
    for (std::list<Abonent>::iterator it = l1.begin(); it != l1.end();) {
    l1.remove();
}
Добавлено через 4 минуты
Мне нужно сделать методы поиска, удаления, добавления абонента(класс Abonent)
Класс Abonent
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Abonent
{
 
  public:
    string familia;
    string raion;
    string adres;
    string number_phone;
    string dogovor_numb;
    string data_dogovora;
    string oplata_ystanovki;
    int abonentskay_plata;
    string data_last_plateja;
 
    Abonent(): familia(""),raion(""),adres(""),number_phone(""),dogovor_numb(""),data_dogovora(""),oplata_ystanovki(""),abonentskay_plata(0),data_last_plateja("") {};
    Abonent(string _familia, string _raion,string _adres,string _number_phone,string _dogovor_numb,string _data_dogovora,string _oplata_ystanovki,int _abonentskay_plata,string _data_last_plateja):
         familia(_familia),raion(_raion),adres(_adres),number_phone(_number_phone),
         dogovor_numb(_dogovor_numb),data_dogovora(_data_dogovora),oplata_ystanovki(_oplata_ystanovki),abonentskay_plata(_abonentskay_plata),data_last_plateja(_data_last_plateja){};
 
    Abonent ( const  Abonent &e) :  familia(e.familia),raion(e.raion),adres(e.adres),number_phone(e.number_phone),dogovor_numb(e.dogovor_numb),
    data_dogovora(e.data_dogovora),oplata_ystanovki(e.oplata_ystanovki),abonentskay_plata(e.abonentskay_plata),data_last_plateja(e.data_last_plateja){};
     friend std::ostream& operator<<(std::ostream& out, const Abonent& e);
     friend std::istream& operator>>(std::istream& in, Abonent& e);
 
void show()
    {
        cout << "Фамилия - " << familia << endl << "Номер телефона -  " << number_phone << endl;
 
    }
 
};
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2017, 14:10
Ответы с готовыми решениями:

Переместить элемент внутри списка std::list
Что-то я не пойму, простая вроде задача - переместить элемент внутри спиcка std::list - стандартной...

Как удалить первый элемент из std::list?
Скажите как удалить первый элемент из лист ругается вот как 181 C:\Documents and...

Создать класс Элемент списка (Node), а затем класс Список (List)
Задание: Создать класс Элемент списка (Node), а затем класс Список (List). В зависимости от...

Что происходит с List если удалить первый элемент?
собственно и сам вопрос что происходит с List если удалить первый в списке элемент?

7
237 / 263 / 218
Регистрация: 14.11.2016
Сообщений: 988
17.09.2017, 15:12 2
Mentalist_, не код класса Abonent нужно прикреплять, а код класса list.

Вставка в конец
Выделяете память под указатель на структуру представляющей ячейку list(обычно это Node).
Присваиваете нужный элемент (NewNode->elem = my_elem;)
next делаем 'нулевым указателем' (NewNode->next = 0;)
Соединяете указатель с хвостом (this->Tail->next = NewNode->prev;)
Перебрасываете хвост на новый элемент (this->Tail = this->Tail->next;)

Удаление
Если есть что удалять...
Ставим указатель на нужную ячейку которую хотим удалить.
Связываем крайние элементы.
По указателю который устанавливали на ячейку - освобождаем память.

Для поиска можно использовать итераторы и алгоритмы find_if / find и др..
0
69 / 68 / 52
Регистрация: 28.10.2015
Сообщений: 388
17.09.2017, 15:30 3
Лучший ответ Сообщение было отмечено Mentalist_ как решение

Решение

Цитата Сообщение от Mentalist_ Посмотреть сообщение
Подскажите как удалить нужный элемент! И неплохо бы было узнать как обращаться к полям объекта в списке
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <algorithm>
#include <list>
#include <functional>
using namespace std;
 
struct B;
 
 
class A
{
    friend struct B;
    string name;
public:
    A(string name) :name(name)
    {}
 
    bool operator==(const A&obj)
    {
        return obj.name==this->name;
    }
 
 
};
struct B : public binary_function< A, string, bool > {
    bool operator () (const A &obj, const string &name) const {
        return obj.name == name;
    }
};
 
 
int main()
{
    list<A>lt;
    lt.emplace_back("John");
    lt.emplace_back("Tod");
    lt.emplace_back("Rob");
    lt.emplace_back("Bob");
    string delName = "Tod";
    auto it=find_if(lt.begin(), lt.end(), bind2nd(B(),delName));
    lt.remove(*it);
 
    system("pause");
    return 0;
}
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
17.09.2017, 15:36 4
так конечно можно предикат задавать, но это же моветон. тем более у вас емплейсы, т.е. плюсы новые. раз так - используйте лямбды.
0
69 / 68 / 52
Регистрация: 28.10.2015
Сообщений: 388
17.09.2017, 15:41 5
Цитата Сообщение от DU3 Посмотреть сообщение
так конечно можно предикат задавать, но это же моветон. тем более у вас емплейсы, т.е. плюсы новые. раз так - используйте лямбды.
просто способ показал, а так лучше будет
C++
1
2
3
4
5
6
7
8
9
10
11
class A
{
public:
...
string getName()const
    {
        return name;
    }
};
...
auto it = find_if(lt.begin(), lt.end(), [delName](const A&obj)->bool {return obj.getName() == delName;});
0
1 / 1 / 4
Регистрация: 05.11.2016
Сообщений: 64
18.09.2017, 13:35  [ТС] 6
Класса list нету просто пользуюсь std::list

Добавлено через 9 часов 33 минуты
C++
1
2
3
4
5
6
7
8
void DeleteAbonent(string named)
{   std::list<Abonent>::iterator it=find_if(l1.begin(), l1.end(), bind2nd(B(),named));
    l1.remove(*it);
    std::list<Abonent>::iterator iter=find_if(l2.begin(), l2.end(), bind2nd(B(),named));
    l2.remove(*iter);
 
 
            }
Не подскажите как проверить есть ли действительно в 1 списке то что я хочу удалить
0
16915 / 9100 / 2227
Регистрация: 30.01.2014
Сообщений: 15,857
18.09.2017, 13:45 7
Цитата Сообщение от Mentalist_ Посмотреть сообщение
есть ли действительно в 1 списке то что я хочу удалить
Сравнить полученный итератор с l1.end().

Добавлено через 6 минут
И лучше вообще сделать так:
C++
1
2
3
4
5
std::list<Abonent>::iterator it=find_if(l1.begin(), l1.end(), bind2nd(B(),named));
if(it != l1.end())
{
    l1.erase(it);
}
Чтобы не тратить время на повторный поиск объекта в remove.
0
1 / 1 / 4
Регистрация: 05.11.2016
Сообщений: 64
18.09.2017, 16:29  [ТС] 8
Скажем, а если надо посчитать абонентскую плату, как то можно работать с этим полем?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.09.2017, 16:29
Помогаю со студенческими работами здесь

Удалить 2-й элемент списка,если он нечетный,иначе этот элемент обнулить
удалить 2-й элемент списка,если он нечетный,иначе этот элемент обнулить

Односвязный список: удалить элемент списка, если он чётный и следующий элемент отрицательный и нечётный
Здравствуйте. Задание на односвязные списки: удалить элемент списка, если он чётный и следующий...

Определить предикат Р(List,Х) который истинен если Х состоит из пар элементов списка List,сумма которых больше половины элементов List
Помогите пожалуйста написать программу,буду очень благодарен,заранее спасибо! Определить предикат...

Удалить из списка L второй элемент, если такой есть
Описать процедуру, которая удаляет из списка L второй элемент, если такой есть. Использовать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru