С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 15.03.2018
Сообщений: 42
1

Класс List template перегрузка операторов объединение List и []

08.12.2020, 17:46. Показов 700. Ответов 4
Метки c++ (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Мне нужно перегрузить операции конкатенации двух списков и доступ к элементам списка через []. Помогите, пожалуйста. Спасибо!

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
template <class T>
class List
{
public:
    List();
    List(const List<T>& cpy); // конструктор копій
    ~List();
    void push_back(T val);                  // додати в кінець списка
    void pop_front();                       // удалити елемент із початку списка
    void print();                           // вивести наявність списку
    bool empty();                           // перевірка списка на пустоту
    List<T>& operator+(const T val);        //перегрузка оператора +
    List<T>& operator [](int i);
    List& operator = (const List& x);
private:
    struct Node                             //структура Node для переходу між елементами у List
    {
        Node(T val)
        {
            data = val;
        }
        T data;
        Node* next;
    };
 
    Node* firstPtr;
    Node* lastPtr;
    unsigned long counts;
};
 
template <class T>
List<T>::List()                             //Конструктор по умолчанию
{
    firstPtr = 0;
    lastPtr = 0;
    counts = 0;
}
//------------------------------
template <class T>
List<T>::List(const List<T>& cpy)           //Конструктор копій
{
    Node* curNode = cpy.firstPtr;
    while (curNode != 0)
    {
        this->push_back(curNode->data);
        curNode = curNode->next;
    }
 
    counts = cpy.counts;
}
//------------------------------
template <class T>
List<T>::~List()                            //Деструктор
{
    while (!this->empty())
        this->pop_front();
}
//------------------------------
template <class T>
void List<T>::push_back(T val)              // додати в кінець списка
{
    Node* v = new Node(val);
    if (this->empty())
    {
        firstPtr = v;
        lastPtr = v;
        firstPtr->next = 0; // равносильно v->next = 0 або lastPtr->next = 0
    }
    else
    {
        lastPtr->next = v;
        lastPtr = v;
        lastPtr->next = 0;
    }
    counts++;
 
}
 
//------------------------------
template <class T>
void List<T>::pop_front()                    // удалити елемент із початку списка
{
    if (this->empty()) // функция не визначена для пустого списка
        throw (-1);
 
    Node* newFirst = firstPtr->next;
    delete firstPtr;
    firstPtr = newFirst;
    counts--;
}
//------------------------------
template <class T>
void List<T>::print()                       //друк
{
    cout << "---------------------" << std::endl;
    for (Node* curNodePtr = firstPtr; curNodePtr != 0; curNodePtr = curNodePtr->next)
    {
        cout << curNodePtr->data << endl;
    }
    cout << "---------------------" << endl;
}
//------------------------------
template <class T>
bool List<T>::empty()                     // перевірка списка на пустоту 
{
    if (counts != 0)
        return false;
    else
        return true;
}
//------------------------------
template <class T>
List<T>& List<T>::operator+(const T val)    //перегрузка оператора +
{
    push_back(val);
    return *this;
}
 
 
template<class T>
List<T>& List<T>::operator[](int i)
{
    if(i<0 || i>=count)
    {
        cout << i << " is a bad index" << endl;
        return '\0';
    }
    else
    {
        List* pv = firstPtr;
        for (int j = 0; j < i; j++)
            pv = pv->next;
        return pv->data;
    }
    // TODO: вставьте здесь оператор return
}
 
template<class T>
List<T>& List<T>::operator=(const List& x)
{
    this->~List();
    Node* pv = new Node;
    pv->data = x[0];
    firstPtr = lastPtr = pv;
    for (int i = 1; i < x.counts; i++) {
        Node* pv = new Node;
        pv->data = x[i];
        lastPtr->next = pv;
        lastPtr = pv;
    }
    lastPtr->next = 0;
    count = x.counts;
    return (*this);
    // TODO: вставьте здесь оператор return
}
 
 
int main()
{
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.12.2020, 17:46
Ответы с готовыми решениями:

Перегрузка операторов для list
Как перегрузить операторы вывода в поток и доступа по индексу для list?

Перегрузка операторов += для list
Добрый день! Ребята, изучаю С++, мне поступило задание, должно быть два модул, первый...

Ошибки: 1) use of class template requires template argument list 2) 'T' : undeclared identifier
Решил подправить свой класс с использованием шаблонов, но столкнулся со следующим косяком. Если я...

'MyQueue' : use of class template requires template argument list
Написал код про шаблоны. Не могу понять почему выводит ошибку во время наследования класса. ошибки...

4
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
08.12.2020, 18:25 2
Цитата Сообщение от Hanser_OO Посмотреть сообщение
Мне нужно перегрузить операции конкатенации двух списков и доступ к элементам списка через [].
Оператора [] у списка вообще не должно быть
0
610 / 415 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
08.12.2020, 18:39 3
Вместо
C++
1
void push_back(T val);
я бы сделал как минимум так:
C++
1
void push_back(const T& val);
А лучше вообще так:
C++
1
template <typename U> void push_back(U&& val);
0
0 / 0 / 0
Регистрация: 15.03.2018
Сообщений: 42
08.12.2020, 19:24  [ТС] 4
Ну у меня такое задание(
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
08.12.2020, 19:31 5
Цитата Сообщение от Hanser_OO Посмотреть сообщение
Ну у меня такое задание(
Конкатенация
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
template <class T>
void List<T>::append(List<T> &lst)
{
    if (!firstptr)
    {
        firstPtr  = lst.firstPtr;
        lastPtr = lst.lastPtr;
        count = lst.count;
    }
    else
    {
        lastPtr->next = lst.lastPtr;
        lastPtr = lst.lastPtr;
        count += lst.count;
    }
 
    lst.firstPtr = lst.lastPtr = nullptr;
    lst.count = 0;
}
0
08.12.2020, 19:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.12.2020, 19:31
Помогаю со студенческими работами здесь

Конвертировать один элемент из List<List<Class>> в list и string
Как можно перевести один выбранный элемент из List&lt;List&lt;Data&gt;&gt; myList в list и string? Например,...

Linq преобразование List<List<double>> в List<Array>
Доброго времени суток, данный код нужно преобразовать linq выражениями и дописать выборку из ...

Intrusive list template
intrusive list template для тренировки хочу попробовать написать шаблон списка, который...

list iterator template
пишу в хэдере #include &lt;list&gt; using namespace std; template &lt;class T&gt; struct Transition {...

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

Template double linked list C++
Пытался реализовать шаблон класса двусвязный список, элементарами которого является класс...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru