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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ vector и конструторы http://www.cyberforum.ru/cpp-beginners/thread914903.html
есть, например, примерно следующий код: #include <stdio.h> #include <conio.h> #include <vector> class CC { int a; public: CC();
C++ Нарушение прав доступа при записи Пытаюсь написать класс, который бы выполнял инициализацию шрифта в directx и печатал строку на экран. Написал рабочий вариант, где инициализация Direct3D и шрифтов происходит в одном классе, помогите, пожалуйста теперь разделить их по разным классам. cFont.h #pragma once //----------------------------------------------------------------------------------- // Инициализация шрифтов... http://www.cyberforum.ru/cpp-beginners/thread914892.html
Массивы. Переписать элемент из двух в один C++
const int N=10; int A, B; cout << "введите первый массив" << endl; for (int i(0); i<N; i++) { cout << "первый массив"<<endl; cout << "введите " << i+1 << " элемент массива: ";
C++ загаданное число
помогите закончить программу int rNum,x; srand(time(0)); rNum = 1 + rand() % (10); cout << "введите число от 0 до 10 -> "; cin >> x ; if (x == rNum) cout << "вы угадали мое число"; else if (x < rNum) cout << "ваше число меньше моего";
C++ Передача массива структур из класса в функцию memcpy http://www.cyberforum.ru/cpp-beginners/thread914877.html
Всем привет! Проблема такая: в рабочем состоянии, массив структур создавался вот таким простым способом: CUSTOMVERTEX Bruce = {{ 50.0f, 50.0f, 0.5f, 0.5f, 0xffff0000}, { 51.0f, 50.0f, 0.5f, 0.5f, 0xffff0000}, { 52.0f, 50.0f, 0.5f, 0.5f, 0xffff0000}, { 53.0f, 50.0f, 0.5f, 0.5f, 0xffff0000}, { 54.0f, 50.0f, 0.5f, 0.5f, 0xffff0000}}; Соответственно, передавая...
C++ Как найти в двоичном дереве поиска минимальный элемент, превышающий некоторое заданное значение? Вот примерная рекурсивная функция, но я не знаю, как выйти из нее в нужный момент. void range(Node *root, int r) { if (root==NULL) return; range(root->left, r); if(root->key > r) { printf("%d\n", root->key); return; //значение найдено, надо здесь выйти из функции, но она рекурсивная, полностью выйти не получается } подробнее

Показать сообщение отдельно
PG94
2 / 2 / 0
Регистрация: 15.01.2012
Сообщений: 181
30.06.2013, 11:17     Закончить определение методов для класса list
Доброго времени суток. Изучаю книгу Страуструпа для начинающих, одно из упражнений - завершить определения для класс 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;
//}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 16:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru