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

Работа с STL list + пропись List.h - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Marry9
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 24
18.11.2014, 19:54     Работа с STL list + пропись List.h #1
Здравствуйте! Помогите, пожалуйста, разобраться с STL list.
Нужно сделать программу в которой будет содержаться класс Student, прописать добавление, изменение, удаление и поиск. List прописать самим.
как прописывать лист вообще понятия не имею, пытаюсь сделать добавление, но успехи практически никакие((
С числами все получается (list <int> L, если не прописывать лист, а вот с классом ничего не выходит(
Помогите!Или дайте аналогичный пример именно с классом

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
#include "stdafx.h"
#include <iostream>
#include <list>
#include <conio.h>
 
using namespace std;
class Student;
 
typedef list <Student> L;
typedef list <Student>::iterator it;
typedef list <Student>::const_iterator c_it;
 
class Student
{
    char* FIO, *faculty;
    int age;
public:
    Student()
    {
        FIO = new char[10];
        faculty = new char[8];
        put_info();
    }
    void show(const L & List)
    {
        for(c_it iSt = List.begin(); iSt != List.end(); ++iSt)
        {
            cout<<"ФИО "<<iSt->FIO<<endl;
            cout<<"Факультет "<<iSt->faculty<<endl;
            cout<<" AGE "<<iSt->age<<endl;
        }
    }
    Student put_info()
    {
        cout<<"ФИО \n";
        cin>>FIO;
        cout<<"AGE \n";
        cin>>age;
        cout<<"Факультет \n";
        cin>>faculty;
        return s;
    }
    
    ~Student()
    {
        delete FIO;
    }
}s;
 
 
void main()
{
    setlocale(LC_ALL, "Ru");
    Student S;
    L p;
 
    p.push_back(S);
    S.put_info();
    p.push_front(S);
 
    _getch();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2014, 19:54     Работа с STL list + пропись List.h
Посмотрите здесь:

C++ STL vector,list
C++ STL>>list<_Ty>
Работа с STL. Поменять vector на list C++
C++ Работа с STL list
C++ STL List
C++ stl::list erase()
C++ STL list
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4441 / 3779 / 1278
Регистрация: 14.04.2014
Сообщений: 14,872
18.11.2014, 20:28     Работа с STL list + пропись List.h #2
Что именно не получается?
Деструктор не соответствует конструктору (не всё удяляется). Нужно перегрузить оператор присваивания.
Ввод-вывод нужно не через перегрузку << >> делать.
Marry9
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 24
18.11.2014, 21:27  [ТС]     Работа с STL list + пропись List.h #3
Ой, в деструкторе действительно не хватает delete faculty;
Я ведь не перегружала << и >>.
А как перегрузить оператор = для итератора?
для класса например так
C++
1
2
3
4
5
6
Student&Student::operator = (const Student ob)
{
    if(this!=&ob)
     age = ob.age;
    return *this;
}
nmcf
4441 / 3779 / 1278
Регистрация: 14.04.2014
Сообщений: 14,872
18.11.2014, 21:35     Работа с STL list + пропись List.h #4
Ну оставь пока put_info(), только не в конструкторе.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Student()
    {
        FIO = new char[10];
        FIO[0] = '\0';
        faculty = new char[8];
        faculty[0] = '\0';
    }
Student & operator = (const Student & ob)
{
    if (this == &ob) return *this;
    strcpy(FIO, ob.FIO);
    strcpy(faculty, ob.faculty);
    age = ob.age;
    return *this;
}
Marry9
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 24
18.11.2014, 22:13  [ТС]     Работа с STL list + пропись List.h #5
а как сделать, чтобы добавление работало так:
C++
1
p.push_back(S.put_info());
Оно то работает, да только выводит бред, а не то, что было введено.
nmcf
4441 / 3779 / 1278
Регистрация: 14.04.2014
Сообщений: 14,872
18.11.2014, 22:22     Работа с STL list + пропись List.h #6
Обязательно так? Ну попробуй:
C++
1
2
3
4
5
6
7
8
9
10
Student put_info()
    {
        cout<<"ФИО \n";
        cin>>FIO;
        cout<<"AGE \n";
        cin>>age;
        cout<<"Факультет \n";
        cin>>faculty;
        return *this;
    }
Marry9
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 24
18.11.2014, 22:42  [ТС]     Работа с STL list + пропись List.h #7
та же ошибка + прерывается работа программы

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void main()
{
    setlocale(LC_ALL, "Ru");
    Student S;
    L p;
    p.push_back(S.put_info());
    S.show(p);
 
    p.push_front(S.put_info());
    S.show(p);
    
    _getch();
}
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
5649 / 3128 / 353
Регистрация: 29.11.2010
Сообщений: 8,376
18.11.2014, 23:21     Работа с STL list + пропись List.h #8
Ваша главная проблема - вы работаете на разном уровне абстракции. Добавление элемента Student в list - проблема класса, содержащего список листов, а не самого Student.
Вам прежде всего нужно создать класс - обёртку, содержащую list<Student>, далее в ней реализовать интерфейс для работы с этим списком. А сам Student можно даже сделать структурой.
nmcf
4441 / 3779 / 1278
Регистрация: 14.04.2014
Сообщений: 14,872
18.11.2014, 23:24     Работа с STL list + пропись List.h #9
Для чего там обёртки? Тут уже был один любитель обёрток с vector.
Marry9
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 24
19.11.2014, 19:21  [ТС]     Работа с STL list + пропись List.h #10
То есть мне ещё нужно создать класс List?
А что в нём должно быть?
nmcf
4441 / 3779 / 1278
Регистрация: 14.04.2014
Сообщений: 14,872
19.11.2014, 20:40     Работа с STL list + пропись List.h #11
Так пойдёт?
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
class Student;
 
typedef std::list<Student> L;
typedef std::list<Student>::iterator IL;
 
class Student
{
    char* FIO, *faculty;
    int age;
public:
    Student()
    {
        FIO = new char[10];
        faculty = new char[8];
        FIO[0] = '\0';
        faculty[0] = '\0';
        age = 0;
    }
    Student(const Student & ob)
    {
        FIO = new char[10];
        faculty = new char[8];
        strcpy(FIO, ob.FIO);
        strcpy(faculty, ob.faculty);
        age = ob.age;
    }
    void show_info()
    {
        cout<<"ФИО "<<FIO<<endl;
        cout<<"Факультет "<<faculty<<endl;
        cout<<" AGE "<<age<<endl;
    }
    Student put_info()
    {
        cout<<"ФИО ";
        cin.getline(FIO, 10);
        cout<<"AGE ";
        cin>>age;
        cin.ignore(1);
        cout<<"Факультет ";
        cin.getline(faculty, 8);
        return *this;
    }
    
    ~Student()
    {
        delete[] FIO;
        delete[] faculty;
    }
 
};
 
int main()
{
    std::locale::global(std::locale(""));
    L p;
    
    p.push_back(Student().put_info());
 
    for (IL i = p.begin(); i != p.end(); ++i) i->show_info();
 
    system("pause");
    return 0;
}
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
5649 / 3128 / 353
Регистрация: 29.11.2010
Сообщений: 8,376
20.11.2014, 01:07     Работа с STL list + пропись List.h #12
- Нет оператора присваиваний
- Лучше использовать список инициализации
- Сам подход создания объекта с мусором, а потом вызов метода для его инициализации вряд ли можно назвать удачным подходом. Лучше сразу создавать объект с нужными данными, хотя бы по тем же причинам, которые кроются за пунктом выше.
- magic number
- если размер фиксирован - его надо вынести как константу для класса
- в данном случае лучше использовать strncpy
nmcf
4441 / 3779 / 1278
Регистрация: 14.04.2014
Сообщений: 14,872
20.11.2014, 10:02     Работа с STL list + пропись List.h #13
MrGluck, это ты мне или автору?
Ilot
Модератор
Эксперт С++
1778 / 1153 / 223
Регистрация: 16.05.2013
Сообщений: 3,042
Записей в блоге: 5
Завершенные тесты: 1
20.11.2014, 10:35     Работа с STL list + пропись List.h #14
nmcf, из-за отсутствия оператора присвоения ваша программа полетит при первом же модифицирующем алгоритме. Золотое правило STL - для помещения объекта в контейнер необходимо позаботится о наличии у него конструктора по умолчанию, конструктора копирования, оператора присвоения и деструктора.
nmcf
4441 / 3779 / 1278
Регистрация: 14.04.2014
Сообщений: 14,872
20.11.2014, 11:46     Работа с STL list + пропись List.h #15
Оператор присваивания был, я его убрал за ненадобностью в данном примере.
Это минимальная переделка программы автора до работоспособного состояния. А что там нужно было изначально, какие идеи - я не знаю.
Marry9
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 24
21.11.2014, 18:22  [ТС]     Работа с STL list + пропись List.h #16
А можно мне пример списка? именно такого: typedef List<любой класс, только не int> L;

Добавлено через 21 секунду
а то я совсем запуталась

Добавлено через 20 часов 23 минуты
Тогда может подскажете как перегрузить <<, чтобы в main можно было сделать так:

C++
1
2
3
4
5
6
7
8
 void main()
{
    setlocale(LC_ALL, "Ru");
    Student S;
    L t;
    t.PushBack(S.put_info());
    for(L::Iterator i = t.Last(); i!=t.End(); i++)
        cout << *i;
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
5649 / 3128 / 353
Регистрация: 29.11.2010
Сообщений: 8,376
21.11.2014, 18:42     Работа с STL list + пропись List.h #17
Цитата Сообщение от nmcf Посмотреть сообщение
MrGluck, это ты мне или автору?
Это комментарии к опубликованному вами коду. Они не относятся к кому-либо конкретно ввиду того, что вы код просто скопировали и доработали. Это оставлено для того, чтобы люди, использующие данный фрагмент, учли описанные выше особенности при использовании.
nmcf
4441 / 3779 / 1278
Регистрация: 14.04.2014
Сообщений: 14,872
21.11.2014, 18:56     Работа с STL list + пропись List.h #18
C++
1
2
3
4
5
6
7
friend ostream & operator << (ostream &os, const Student &st)
{
    os << "ФИО " << st.FIO << endl;
    os << "Факультет "<< st.faculty << endl;
    os << " AGE " << st.age << endl;
    return os;
}
Marry9
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 24
21.11.2014, 19:17  [ТС]     Работа с STL list + пропись List.h #19
A можно ли как-нибудь сделать так, чтобы в main можно было показать содержимое списка так:
C++
1
2
3
4
5
6
7
void main()
{
    Student S;
    L t;
    t.PushBack(S.put_info());
    for(L::Iterator i = t.Last(); i!=t.End(); --i)
        [COLOR="DarkOliveGreen"]cout << t;[/COLOR]
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2014, 19:45     Работа с STL list + пропись List.h
Еще ссылки по теме:

List STL C++
STL list C++
C++ Работа с двунаправленым списком. STL <list>
Программа с List из STL C++
C++ Реализация list из STL

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

Или воспользуйтесь поиском по форуму:
nmcf
4441 / 3779 / 1278
Регистрация: 14.04.2014
Сообщений: 14,872
21.11.2014, 19:45     Работа с STL list + пропись List.h #20
В обратном порядке, что ли?
C++
1
for(L::Iterator i = t.rbegin(); i!=t.rend(); ++i)
Yandex
Объявления
21.11.2014, 19:45     Работа с STL list + пропись List.h
Ответ Создать тему
Опции темы

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