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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
PG94
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
#1

Закончить определение методов для класса list - C++

30.06.2013, 11:17. Просмотров 268. Ответов 0
Метки нет (Все метки)

Доброго времени суток. Изучаю книгу Страуструпа для начинающих, одно из упражнений - завершить определения для класс list, являющегося упрощённым подобием std::list. Код ниже. Помогите, пожалуйста, разрешить следующие проблему:
Как написать функции insert и erase, которые на вход получают iterator, а не Link<Elem>* (Быстрее всего переставить указатели в узлах, но с итератором доступ к ним не получить)?
Спасибо.
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
template<class Elem> struct Link {
    Link* prev;    // previous link
    Link* succ;    // successor (next) link
    Elem  val;     // the value
    Link(const Elem& v = Elem(), Link* p = 0, Link* s = 0) : val(v), prev(p), succ(s) {}
};
 
//------------------------------------------------------------------------------
 
template<class Elem> class list {
    // representation and implementation details
public:
    class iterator;     // member type: iterator
 
    list() : first(new Link<Elem>()), last(first) {}
 
    iterator begin();   // iterator to first element
    iterator end();     // iterator to one beyond last element
 
    //iterator insert(iterator p, const Elem& v); // insert v into list after p
    //iterator erase(iterator p);                 // remove p from the list
 
    void push_back(const Elem& v);  // insert v at end
    void push_front(const Elem& v); // insert v at front
    void pop_front();   // remove the first element
    void pop_back();    // remove the last element
 
    Elem& front() { return *first; }    // the first element
    Elem& back() 
    {   
        if (first==last) return *last;
        else return *(last->prev);
    }       // the last element
 
    Link<Elem>* first;
    Link<Elem>* last;   // one-beyond-the-last link
};
 
//------------------------------------------------------------------------------
 
template<class Elem> class list<Elem>::iterator {
private:
    Link<Elem>* curr;   // current node
public:
    iterator(Link<Elem>* p) :curr(p) { }
    iterator& operator++() {curr = curr->succ; return *this; } // forward
    iterator& operator--() {curr = curr->prev; return *this; } // backwards
    Elem& operator*() { return curr->val; } // get value (dereference)
 
    friend bool operator==(const iterator& a, const iterator& b)
    {
        return a.curr==b.curr;
    }
 
    friend bool operator!=(const iterator& a, const iterator& b)
    {
        return a.curr!=b.curr;
    }
};
 
//------------------------------------------------------------------------------
 
template<class Elem> 
typename list<Elem>::iterator list<Elem>::begin()  // iterator to first element
{ 
    return iterator(first); 
}
 
//------------------------------------------------------------------------------
 
template<class Elem> 
typename list<Elem>::iterator list<Elem>::end() // iterator to one beyond last element
{ 
    return iterator(last); 
}
 
//------------------------------------------------------------------------------
 
template<class Elem> 
void list<Elem>::push_front(const Elem& v) // insert v at front
{
    first->prev=new Link<Elem>(v,0,first); 
    first=first->prev;
}
 
template<class Elem>
void list<Elem>::push_back(const Elem& v)
{
    Link<Elem>* lnk=new Link<Elem>(v,last->prev,last);
    if (last->prev) last->prev->succ=lnk;
    last->prev=lnk;
    if (first==last) first=first->prev;     //вставка в пустой список
}
 
template<class Elem>
void list<Elem>::pop_front()
{
    if (first==last) return;
    first=first->succ;
    delete first->prev;
    first->prev=0;
}
 
template<class Elem>
void list<Elem>::pop_back()
{
    if (first==last) return;
    Link<Elem>* lnk=last->prev;
    last->prev=lnk->prev;
    lnk->prev->succ=last;
    delete lnk;
}
 
//template<class Elem>
//typename list<Elem>::iterator list<Elem>::insert(iterator p, const Elem& val)
//{
//  Link<Elem>* pp=p.curr;
//  Link<Elem>* lnk=new Link<Elem>(val,pp->prev,pp);
//  pp->prev->succ=lnk;
//  pp->prev=lnk;
//  return lnk;
//}
 
//template<class Elem>
//typename list<Elem>::iterator list<Elem>::erase(iterator p)
//{
//  if (first==last) return first;
//  Link<Elem>* pp=p.curr;
//  Link<Elem>* lnk=pp->prev;
//  lnk->succ=pp->succ;
//  pp->succ->prev=lnk;
//  delete p;
//  return lnk;
//}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2013, 11:17     Закончить определение методов для класса list
Посмотрите здесь:

Определение методов шаблонного класса в файле реализации - C++
Доброго времени суток, форумчане! :) Поздравляю всех мужчин с праздником. Желаю быть мужественными, стойкими, рассудительными и...

Напишите реализацию методов, предоставляющих доступ к данным класса. Отобразите в программе работу этих методов - C++
Реализация методов класса. Напишите реализацию методов, предоставляющих доступ к данным класса. Отобразите в программе...

3 объекта класса с вызовом для них соответствующих методов - C++
Разработайте программу с использованием класса Average, в котором реализованы вычисления среднего арифметического и среднего...

Реализуйте интерфейс динамической структуры list для работы с объектами класса А - C++
Добрый день товарищи программисты. Столкнулся с задачей и никак не могу решить... Так вот вопросы по заданию заключаются в следующем: ...

Определение класса leverage и метода для доступа к закрытому полю - C++
Напишите определение класса leverage, включающего одно закрытое поле типа int с именем crowbar. Напишите метод getcrow() для класса...

Определение методов set/get в *.h - C++
Методы доступа занимают 1-2 строчки. Можно-ли их определять сразу в *.h, или там можно только объявлять, а определять обязательно...

Определение классов и методов - C++
Доброго времени суток! Изучаю язык не долго, самостоятельно и есть проблемка - не могу понять, как определяются методы классов( в VB,...

Перегрузка методов класса - C++
Проблема заключается в следующем я не получается правильно сделать задание. Задание:&quot;Для класса реализовать набор операций для работы с...

Назначение виртуальных методов класса - C++
Что-то никак не могу разобраться с виртуальными методами классов. В учебниках пишут, что они нужны при наследовании для определения одной и...

Вызов методов производного класса - C++
Возникла проблема с выполнением задачи. программа запускается, работает, но почему-то не выводит метод scan и print наследовательного...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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