Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Marry9
0 / 0 / 1
Регистрация: 18.11.2014
Сообщений: 24
#1

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

18.11.2014, 19:54. Просмотров 1309. Ответов 28
Метки нет (Все метки)

Здравствуйте! Помогите, пожалуйста, разобраться с 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();
}

http://www.cyberforum.ru/cpp-beginners/thread354188.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2014, 19:54
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Работа с STL list + пропись List.h (C++):

Работа с STL <list>
В общем, есть текст, программа выделяет в тексте последовательность введённую с...

Работа с двунаправленым списком. STL <list>
Помогите пожалуста найти ошибку.. 3) Даны натуральное число n, действительные...

Работа с STL. Поменять vector на list
Программа должна быть написана так, чтобы достаточно было заменить в одном...

STL list
Доброго времени суток, пока имею поверхностное представление о алгоритмах STL и...

STL List
Вот в чем проблема, была дана задача, решить которую надо было с помощью Deque...

28
nmcf
6238 / 5550 / 2525
Регистрация: 14.04.2014
Сообщений: 23,338
18.11.2014, 20:28 #2
Что именно не получается?
Деструктор не соответствует конструктору (не всё удяляется). Нужно перегрузить оператор присваивания.
Ввод-вывод нужно не через перегрузку << >> делать.
0
Marry9
0 / 0 / 1
Регистрация: 18.11.2014
Сообщений: 24
18.11.2014, 21:27  [ТС] #3
Ой, в деструкторе действительно не хватает delete faculty;
Я ведь не перегружала << и >>.
А как перегрузить оператор = для итератора?
для класса например так
C++
1
2
3
4
5
6
Student&Student::operator = (const Student ob)
{
    if(this!=&ob)
     age = ob.age;
    return *this;
}
0
nmcf
6238 / 5550 / 2525
Регистрация: 14.04.2014
Сообщений: 23,338
18.11.2014, 21:35 #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;
}
0
Marry9
0 / 0 / 1
Регистрация: 18.11.2014
Сообщений: 24
18.11.2014, 22:13  [ТС] #5
а как сделать, чтобы добавление работало так:
C++
1
p.push_back(S.put_info());
Оно то работает, да только выводит бред, а не то, что было введено.
0
nmcf
6238 / 5550 / 2525
Регистрация: 14.04.2014
Сообщений: 23,338
18.11.2014, 22:22 #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;
    }
0
Marry9
0 / 0 / 1
Регистрация: 18.11.2014
Сообщений: 24
18.11.2014, 22:42  [ТС] #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();
}
0
MrGluck
Модератор
Эксперт CЭксперт С++
8021 / 4864 / 1425
Регистрация: 29.11.2010
Сообщений: 13,240
18.11.2014, 23:21 #8
Ваша главная проблема - вы работаете на разном уровне абстракции. Добавление элемента Student в list - проблема класса, содержащего список листов, а не самого Student.
Вам прежде всего нужно создать класс - обёртку, содержащую list<Student>, далее в ней реализовать интерфейс для работы с этим списком. А сам Student можно даже сделать структурой.
1
nmcf
6238 / 5550 / 2525
Регистрация: 14.04.2014
Сообщений: 23,338
18.11.2014, 23:24 #9
Для чего там обёртки? Тут уже был один любитель обёрток с vector.
0
Marry9
0 / 0 / 1
Регистрация: 18.11.2014
Сообщений: 24
19.11.2014, 19:21  [ТС] #10
То есть мне ещё нужно создать класс List?
А что в нём должно быть?
0
nmcf
6238 / 5550 / 2525
Регистрация: 14.04.2014
Сообщений: 23,338
19.11.2014, 20:40 #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;
}
1
MrGluck
Модератор
Эксперт CЭксперт С++
8021 / 4864 / 1425
Регистрация: 29.11.2010
Сообщений: 13,240
20.11.2014, 01:07 #12
- Нет оператора присваиваний
- Лучше использовать список инициализации
- Сам подход создания объекта с мусором, а потом вызов метода для его инициализации вряд ли можно назвать удачным подходом. Лучше сразу создавать объект с нужными данными, хотя бы по тем же причинам, которые кроются за пунктом выше.
- magic number
- если размер фиксирован - его надо вынести как константу для класса
- в данном случае лучше использовать strncpy
0
nmcf
6238 / 5550 / 2525
Регистрация: 14.04.2014
Сообщений: 23,338
20.11.2014, 10:02 #13
MrGluck, это ты мне или автору?
0
Ilot
Эксперт С++
1826 / 1184 / 342
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
20.11.2014, 10:35 #14
nmcf, из-за отсутствия оператора присвоения ваша программа полетит при первом же модифицирующем алгоритме. Золотое правило STL - для помещения объекта в контейнер необходимо позаботится о наличии у него конструктора по умолчанию, конструктора копирования, оператора присвоения и деструктора.
0
nmcf
6238 / 5550 / 2525
Регистрация: 14.04.2014
Сообщений: 23,338
20.11.2014, 11:46 #15
Оператор присваивания был, я его убрал за ненадобностью в данном примере.
Это минимальная переделка программы автора до работоспособного состояния. А что там нужно было изначально, какие идеи - я не знаю.
0
Marry9
0 / 0 / 1
Регистрация: 18.11.2014
Сообщений: 24
21.11.2014, 18:22  [ТС] #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;
0
MrGluck
Модератор
Эксперт CЭксперт С++
8021 / 4864 / 1425
Регистрация: 29.11.2010
Сообщений: 13,240
21.11.2014, 18:42 #17
Цитата Сообщение от nmcf Посмотреть сообщение
MrGluck, это ты мне или автору?
Это комментарии к опубликованному вами коду. Они не относятся к кому-либо конкретно ввиду того, что вы код просто скопировали и доработали. Это оставлено для того, чтобы люди, использующие данный фрагмент, учли описанные выше особенности при использовании.
0
nmcf
6238 / 5550 / 2525
Регистрация: 14.04.2014
Сообщений: 23,338
21.11.2014, 18:56 #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;
}
1
Marry9
0 / 0 / 1
Регистрация: 18.11.2014
Сообщений: 24
21.11.2014, 19:17  [ТС] #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]
0
nmcf
6238 / 5550 / 2525
Регистрация: 14.04.2014
Сообщений: 23,338
21.11.2014, 19:45 #20
В обратном порядке, что ли?
C++
1
for(L::Iterator i = t.rbegin(); i!=t.rend(); ++i)
0
21.11.2014, 19:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.11.2014, 19:45
Привет! Вот еще темы с решениями:

STL list
как вставить элемент в середину списка list STL? float list_insert_rand(int...

List STL
В общем нужно создать класс STL c помощью list: CStudent.h #include &lt;string&gt;...

Программа с List из STL
Здравствуйте ребята. Прошу помочь мне с моим кодом. ошибок вроде нету, но не...

STL vector,list
У меня 2 вопроса: 1) можете рассказать,как подробно работает...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru