Форум программистов, компьютерный форум CyberForum.ru

Необходимо удалить элемент списка - C++

Восстановить пароль Регистрация
 
EvgeniyV
0 / 0 / 0
Регистрация: 23.12.2010
Сообщений: 4
23.12.2010, 12:16     Необходимо удалить элемент списка #1
Привет!!! Пишу курсовую работу, используя библиотеку STL. Конкретно работаю с классом list. Сейчас мне необходимо удалить элемент списка, для этого использую функцию erase(), принцип ее работы мне ясен, но я использую не стандартные типы, а элементом списка является созданный мною класс, подскажите пожалуйста, что мне нужно перегрузить или что делаю неправильно.
Вот код:
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
// kursovik.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
#include <fstream> 
#include <list>
#include <conio.h>
#include <string>
 
using namespace std;
char* strcpy( char* s1, char* s2)
    {
        int i=0;
        s1[1]=0;
        while(!s2[i]==0)
            {
                s1[i]=s2[i];
                i++;
            }
        s1[i++]=0;
        return s1;
    }
class Info
{   public:
        char floor[2];                      //пол 
        int age;                            //возраст
        char formation[20];                 //образование 
        int general_experience;             //общий стаж
        int work_experience_in_last_post;   //стаж работы в последней занимаемой должности
 
        Info(char _floor[2]="-", int _age=18,char _formation[20]="-", int _general_experience=0, int _work_experience_in_last_post=0)
            {
                strcpy(floor, _floor);                      
                age=_age;                           
                strcpy(formation, _formation);               
                general_experience=_general_experience;             
                work_experience_in_last_post=_work_experience_in_last_post; 
            }
};
 
class Unemployed: public Info
{
        char surname[20];                       //фамилия
        char trade[20];                         //профессия 
        char post[20];                          //должность 
        int date_account[3];                    //дата постановки на учет
        int desirable_salary;                   //желаемая зарплата 
        char desirable_post[20];                //желаемая должность
    public:
        Unemployed(char _surname[20]="-", char _trade[20]="-", char _post[20]="-", int _date_account[3]=(0,0,0), int _desirable_salary=0,   char _desirable_post[20]="-",char _floor[2]="-", int _age=18,char _formation[20]="-", int _general_experience=0, int _work_experience_in_last_post=0)
                :Info(_floor, _age,_formation,  _general_experience,  _work_experience_in_last_post)
            {
                strcpy(surname, _surname); 
                strcpy(trade,_trade);
                strcpy(post, _post); 
                for(int i=0;i<3;i++)
                    date_account[i]=_date_account[i]; 
                desirable_salary=_desirable_salary; 
                strcpy(desirable_post,_desirable_post);
            }
 
};  
class Vacancy: public Info
{public:
        char firm[20];                      //название фирмы
        char vacant_post[20];               //вакантная должность 
        int salary;                         //заработная плата
    
        Vacancy(char _firm[20]="-", char _vacant_post[20]="-", int _salary=0,char _floor[2]="-", int _age=18,char _formation[20]="-", int _general_experience=0, int _work_experience_in_last_post=0)
                :Info(_floor, _age,_formation,  _general_experience,  _work_experience_in_last_post)
            {
                strcpy(firm,_firm);
                strcpy(vacant_post, _vacant_post);
                salary=_salary;
            }
        Vacancy show();
        int get();
        friend istream & operator>>(istream &, Vacancy &);
        friend ostream &operator << ( ostream & , Vacancy& );
        bool operator<(Vacancy &);
        bool operator>(Vacancy &);
        bool operator==(Vacancy &);
        bool operator!=(Vacancy &);
        friend ifstream & operator>>(ifstream & , Vacancy &);
        Vacancy operator = (Vacancy);
};
//Функции класса Vacancy 
int Vacancy::get()
    {
        cin>>firm;
        return 1;
    }
Vacancy Vacancy::show()
    {
        //cout<<firm<<" "<<vacant_post<<" "<<salary<<" "<<floor<<" "<<age<<""<<formation<<" "<<general_experience<<" "<<work_experience_in_last_post<<endl;
        return *this;
    }
 
//Перегрузка операторов класса Vacancy
istream & operator>>(istream & s, Vacancy &V)
    {   
        cout<<"Vvedite firmu\n";
        s>>V.firm;
        cout<<"Vvedite vaccantnuy dolznost\n";
        s>>V.vacant_post;
        cout<<"Vvedite zarplatu\n";
        s>>V.salary;
        cout<<"Vvedite pol\n";
        s>>V.floor;
        cout<<"Vvedite vozrast\n";
        s>>V.age;
        cout<<"Vvedite obrazovanie\n";
        s>>V.formation;
        cout<<"Vvedite staz raboti\n";
        s>>V.general_experience;
        cout<<"Vvedite staz na posledney rabote\n";
        s>>V.work_experience_in_last_post;
        return s;
    }
ifstream & operator>>(ifstream & s, Vacancy &V)
    {   
        s>>V.firm;
        s>>V.vacant_post;
        s>>V.salary;
        s>>V.floor;
        s>>V.age;
        s>>V.formation;
        s>>V.general_experience;
        s>>V.work_experience_in_last_post;
        return s;
    }
ostream &operator << ( ostream &s , Vacancy &V )
    {
        s<<V.firm<<" "<<V.vacant_post<<" "<<V.salary<<" "<<V.floor<<" "<<V.age<<" "<<V.formation<<" "<<V.general_experience<<" "<<V.work_experience_in_last_post;
        return s;
    }
/*bool Vacancy::operator<(Vacancy &ob)
    {
        return firm < ob.firm;
    }
bool Vacancy::operator>(Vacancy &ob)
    {
        return firm > ob.firm;
    }
bool Vacancy::operator==(Vacancy &ob)
    {
        return firm == ob.firm;
    }
bool Vacancy::operator!=(Vacancy &ob)
    {
        return firm != ob.firm;
    }*/
Vacancy Vacancy::operator = (Vacancy V)
    {
        strcpy(firm,V.firm);
        strcpy(vacant_post,V.vacant_post);
        salary=V.salary;
        strcpy(floor,V.floor);
        age=V.age;
        strcpy(formation,V.formation);
        general_experience=V.general_experience;
        work_experience_in_last_post=V.work_experience_in_last_post;
        return *this;
    }
 
int MENU()
{
    cout<<"\tMENU:\n";
    cout<<"1-dly dobavleniy\n2-dly prosmotra\n3-dly poiska\n4-dly udaleyiy\n5-sohraneniy\n6-zagruzki\n";
    cout<<"Vibereri punkt menu\n";
    return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
    Vacancy Vac;
    int k=1;
    list <Vacancy> lst1;    
    list<Vacancy>::iterator p;
    ofstream file_object("Vacancy.txt",ios::app); //сохранение в файл
    ifstream input_file("Vacancy.txt",ios::app) ; 
    while(k!=0)
        {
            MENU();
            cin>>k;
            switch(k)
                {
                    case 1:
                        cin>>Vac;
                        lst1.push_back(Vac);
                        _getch();
                        break;
                    case 2:
                        p = lst1.begin();
                        while(p!=lst1.end())
                            {
                                cout<<*p<<endl;
                                p++;
                            }
                        _getch();
                        break;
                    case 3:
                        p = lst1.begin();
                        char poisk[20];
                        cout<<"Vvedite firmu kotoruyu nado nayti"<<endl;
                        cin>>poisk;
                        while(p!=lst1.end())
                            {
                                if (strcmp(p->firm,poisk)==0)
                                    {
                                        cout<<*p;
                                        lst1.erase(p);
                                    }
                                p++;
                            }
                        _getch();
                        break;
                    case 4:
                        lst1.clear();
                        _getch();
                        break;
                    case 5:
                        p = lst1.begin();
                        while(p!=lst1.end())
                            {
                                file_object<<*p;
                                p++;
                            }
 
                        _getch();
                        break;
                    case 6:
                        while (! input_file.eof()) 
                            {
                                input_file>>Vac;
                                lst1.push_back(Vac);
                            }
                        _getch();
                        break;
                    case 0:
                        exit(0);
                        _getch();
                        break;
                }
        }
    file_object.close();
    input_file.close();
    _getch();
    return 0;
}
Я привел весь код, в котором возможно есть еще много чего, что нормальные программисты не делают, но все так меня больше всего интересует только вот эта часть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    p = lst1.begin();
    char poisk[20];
    cout<<"Vvedite firmu kotoruyu nado nayti"<<endl;
    cin>>poisk;
    while(p!=lst1.end())
        {
            if (strcmp(p->firm,poisk)==0)
                {
                    cout<<*p;
                    lst1.erase(p);
                }
                 p++;
        }
Спасибо за помощь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2010, 12:16     Необходимо удалить элемент списка
Посмотрите здесь:

Удалить элемент из односвязного списка C++
C++ удалить первый элемент из списка
C++ Удалить первый элемент списка
Удалить элемент из списка C++
Удалить элемент из односвязного списка C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
23.12.2010, 12:57     Необходимо удалить элемент списка #2
пример удаления элемента из списка
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
#include <list>
#include <algorithm>
#include <iterator>
#include <iostream>
#include <conio.h>
#include <stdio.h>
 
using namespace std;
 
#define SIZE 20
 
int main()
{
    setlocale(0, "Russian");
    // создали список;
    list<char*> clist;
    // добавляем туда всякие элементы;
    clist.push_back("Coca-Cola");
    clist.push_back("Nissan");
    clist.push_back("Opel");
    clist.push_back("Mersedes");
    // выводим полученный список;
    cout << "Созданный список" << endl << "\t";
    copy(clist.begin(), clist.end(), ostream_iterator<char*>(std::cout, "\n\t"));
    // теперь ищем элемент заданный и удаляем его;
    list<char*>::iterator i = find(clist.begin(), clist.end(), "Opel");
    if (i != clist.end()) // если элемента найден;
        clist.erase(i);
    // выводим полученный список;
    cout << "\nСписок с удаленным элементом" << endl << "\t";
    copy(clist.begin(), clist.end(), ostream_iterator<char*>(std::cout, "\n\t"));
    _getch();
    return EXIT_SUCCESS; 
}
EvgeniyV
0 / 0 / 0
Регистрация: 23.12.2010
Сообщений: 4
23.12.2010, 13:24  [ТС]     Необходимо удалить элемент списка #3
Я говорил выше удалить элемент списка с стандартными типами данных я могу, у меня проблема как раз в том что мой список состоит из класса, и во время выполнения этого этапа в самой программе срабатывает ошибка
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
23.12.2010, 13:28     Необходимо удалить элемент списка #4
ты просто создай конструктор в классе, который принимает название фирмы, которую надо удалить. Перегрузи оператор == чтобы можно было находить занный объект, true будет когда название фирм совпадает. Затем находим что надо удалить так list<Vacancy>::iterator i = find(lst1.begin(), lst1.end(), Vacancy(poisk));
lst1.erase(i);
EvgeniyV
0 / 0 / 0
Регистрация: 23.12.2010
Сообщений: 4
23.12.2010, 13:31  [ТС]     Необходимо удалить элемент списка #5
Спасибо так гораздо понятней)))
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
23.12.2010, 13:36     Необходимо удалить элемент списка #6
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
#include <iostream>
#include <fstream> 
#include <list>
#include <conio.h>
#include <string>
#include <algorithm>
 
using namespace std;
char* strcpy( char* s1, char* s2)
        {
                int i=0;
                s1[1]=0;
                while(!s2[i]==0)
                        {
                                s1[i]=s2[i];
                                i++;
                        }
                s1[i++]=0;
                return s1;
        }
class Info
{       public:
                char floor[2];                                          //пол 
                int age;                                                        //возраст
                char formation[20];                                     //образование 
                int general_experience;                         //общий стаж
                int work_experience_in_last_post;       //стаж работы в последней занимаемой должности
 
                Info(char _floor[2]="-", int _age=18,char _formation[20]="-", int _general_experience=0, int _work_experience_in_last_post=0)
                        {
                                strcpy(floor, _floor);                                          
                                age=_age;                                                       
                                strcpy(formation, _formation);                           
                                general_experience=_general_experience;                         
                                work_experience_in_last_post=_work_experience_in_last_post;     
                        }
};
 
class Unemployed: public Info
{
                char surname[20];                                               //фамилия
                char trade[20];                                                 //профессия 
                char post[20];                                                  //должность 
                int date_account[3];                                    //дата постановки на учет
                int desirable_salary;                                   //желаемая зарплата 
                char desirable_post[20];                                //желаемая должность
        public:
                Unemployed(char _surname[20]="-", char _trade[20]="-", char _post[20]="-", int _date_account[3]=(0,0,0), int _desirable_salary=0,       char _desirable_post[20]="-",char _floor[2]="-", int _age=18,char _formation[20]="-", int _general_experience=0, int _work_experience_in_last_post=0)
                                :Info(_floor, _age,_formation,  _general_experience,  _work_experience_in_last_post)
                        {
                                strcpy(surname, _surname); 
                                strcpy(trade,_trade);
                                strcpy(post, _post); 
                                for(int i=0;i<3;i++)
                                        date_account[i]=_date_account[i]; 
                                desirable_salary=_desirable_salary;     
                                strcpy(desirable_post,_desirable_post);
                        }
 
};      
class Vacancy: public Info
{public:
                char firm[20];                                          //название фирмы
                char vacant_post[20];                           //вакантная должность 
                int salary;                                                     //заработная плата
        
                Vacancy(char _firm[20]="-", char _vacant_post[20]="-", int _salary=0,char _floor[2]="-", int _age=18,char _formation[20]="-", int _general_experience=0, int _work_experience_in_last_post=0)
                                :Info(_floor, _age,_formation,  _general_experience,  _work_experience_in_last_post)
                        {
                                strcpy(firm,_firm);
                                strcpy(vacant_post, _vacant_post);
                                salary=_salary;
                        }
                Vacancy show();
                int get();
                friend istream & operator>>(istream &, Vacancy &);
                friend ostream &operator << ( ostream & , Vacancy& );
                bool operator<(Vacancy &);
                bool operator>(Vacancy &);
                bool operator==(Vacancy);
                bool operator!=(Vacancy &);
                friend ifstream & operator>>(ifstream & , Vacancy &);
                Vacancy operator = (Vacancy);
                Vacancy(const char* Buffer)
                {
                    Vacancy();
                    strcpy(firm, Buffer);
                }
};
//Функции класса Vacancy 
int Vacancy::get()
        {
                cin>>firm;
                return 1;
        }
Vacancy Vacancy::show()
        {
                //cout<<firm<<" "<<vacant_post<<" "<<salary<<" "<<floor<<" "<<age<<""<<formation<<" "<<general_experience<<" "<<work_experience_in_last_post<<endl;
                return *this;
        }
 
//Перегрузка операторов класса Vacancy
istream & operator>>(istream & s, Vacancy &V)
        {       
                cout<<"Vvedite firmu\n";
                s>>V.firm;
                cout<<"Vvedite vaccantnuy dolznost\n";
                s>>V.vacant_post;
                cout<<"Vvedite zarplatu\n";
                s>>V.salary;
                cout<<"Vvedite pol\n";
                s>>V.floor;
                cout<<"Vvedite vozrast\n";
                s>>V.age;
                cout<<"Vvedite obrazovanie\n";
                s>>V.formation;
                cout<<"Vvedite staz raboti\n";
                s>>V.general_experience;
                cout<<"Vvedite staz na posledney rabote\n";
                s>>V.work_experience_in_last_post;
                return s;
        }
ifstream & operator>>(ifstream & s, Vacancy &V)
        {       
                s>>V.firm;
                s>>V.vacant_post;
                s>>V.salary;
                s>>V.floor;
                s>>V.age;
                s>>V.formation;
                s>>V.general_experience;
                s>>V.work_experience_in_last_post;
                return s;
        }
ostream &operator << ( ostream &s , Vacancy &V )
        {
                s<<V.firm<<" "<<V.vacant_post<<" "<<V.salary<<" "<<V.floor<<" "<<V.age<<" "<<V.formation<<" "<<V.general_experience<<" "<<V.work_experience_in_last_post;
                return s;
        }
/*bool Vacancy::operator<(Vacancy &ob)
        {
                return firm < ob.firm;
        }
bool Vacancy::operator>(Vacancy &ob)
        {
                return firm > ob.firm;
        }*/
bool Vacancy::operator==(Vacancy ob)
        {
                return !strcmp(firm, ob.firm);
        }
/*bool Vacancy::operator!=(Vacancy &ob)
        {
                return firm != ob.firm;
        }*/
Vacancy Vacancy::operator = (Vacancy V)
{
    strcpy(firm,V.firm);
    strcpy(vacant_post,V.vacant_post);
    salary=V.salary;
    strcpy(floor,V.floor);
    age=V.age;
    strcpy(formation,V.formation);
    general_experience=V.general_experience;
    work_experience_in_last_post=V.work_experience_in_last_post;
    return *this;
}
 
 
int MENU()
{
        cout<<"\tMENU:\n";
        cout<<"1-dly dobavleniy\n2-dly prosmotra\n3-dly poiska\n4-dly udaleyiy\n5-sohraneniy\n6-zagruzki\n";
        cout<<"Vibereri punkt menu\n";
        return 0;
}
 
 
int main()
{
        Vacancy Vac;
        int k=1;
        list <Vacancy> lst1;    
        list<Vacancy>::iterator p;
        ofstream file_object("Vacancy.txt",ios::app); //сохранение в файл
        ifstream input_file("Vacancy.txt",ios::app) ; 
        while(k!=0)
        {
            MENU();
            cin>>k;
            switch(k)
            {
            case 1:
                cin>>Vac;
                lst1.push_back(Vac);
                _getch();
                break;
            case 2:
                p = lst1.begin();
                while(p!=lst1.end())
                {
                    cout<<*p<<endl;
                    p++;
                }
                _getch();
                break;
            case 3:
                {
                    p = lst1.begin();
                    char poisk[20];
                    cout<<"Vvedite firmu kotoruyu nado nayti"<<endl;
                    cin>>poisk;
                    list<Vacancy>::iterator i = find(lst1.begin(), lst1.end(), Vacancy(poisk));
                    lst1.erase(i);
                    _getch();
                    break;
                }
            case 4:
                lst1.clear();
                _getch();
                break;
            case 5:
                p = lst1.begin();
                while(p!=lst1.end())
                {
                    file_object<<*p;
                    p++;
                }
 
                _getch();
                break;
            case 6:
                while (! input_file.eof()) 
                {
                    input_file>>Vac;
                    lst1.push_back(Vac);
                }
                _getch();
                break;
            case 0:
                exit(0);
                _getch();
                break;
            }
        }
        file_object.close();
        input_file.close();
        _getch();
        return 0;
}
вот все работает :-)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2010, 13:54     Необходимо удалить элемент списка
Еще ссылки по теме:

Удалить элемент из списка C++
Удалить первый элемент односвязного списка C++
C++ Задача Иосифа Флавия. Удалить каждый второй элемент из списка и в конце вывести на экран последний оставшийся элемент

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

Или воспользуйтесь поиском по форуму:
EvgeniyV
0 / 0 / 0
Регистрация: 23.12.2010
Сообщений: 4
23.12.2010, 13:54  [ТС]     Необходимо удалить элемент списка #7
Огромное спасибо
Yandex
Объявления
23.12.2010, 13:54     Необходимо удалить элемент списка
Ответ Создать тему
Опции темы

Текущее время: 03:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru