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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.88
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
#1

Стек на шаблонах - оцените реализацию - C++

17.07.2014, 00:21. Просмотров 3240. Ответов 101
Метки нет (Все метки)

просто хочу узнать чужое мнение, написал стек через шаблоны, оцените реализацию
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
template <typename T>
class Stack
{
private:
    size_t size;
    T* data;
public:
    Stack();
    void Push(T value);
    T Pop();
};
 
template <typename T>
Stack<T>::Stack()
{
    size = sizeof(T);
    data = new T;
}
 
template <typename T>
void Stack<T>::Push(T value)
{
    data = data + size;
    *data = value;
}
 
template <typename T>
T Stack<T>::Pop()
{
    int tmp = *data;
    data = data - size;
    T* ptr = data + size;
    ptr = nullptr;
    return tmp;
}
Добавлено через 1 минуту
з.ы. сначала пытался париться как это в идеале надо prev, next (т.е. предыдущий и следующий элементы) потом забил, толку с них никакого, все равно по смещению ищу значение
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2014, 00:21     Стек на шаблонах - оцените реализацию
Посмотрите здесь:

Выкладываю реализацию алгоритма Дейкстры на С++ C++
Вопрос по исключениям в шаблонах классов C++
C++ Разделение программы на интерфейс и реализацию
Доступ к элементам tuple в шаблонах C++
Тип, зависимый от условия в шаблонах C++
C++ Посоветуйте сайт или книгу где хорошо изложена информация о ШАБЛОНАХ КЛАССОВ
C++ Подстановка вычисляемого типа в шаблонах
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Хедин
73 / 68 / 36
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 12:20     Стек на шаблонах - оцените реализацию #41
GetHelp, код ваш покажите. Посмотрел код на вашем примере и, по моему, понимаю, почему у вас не крашится. В стеке у вас всегда находится не больше 1 элемента, попробуйте туда записать сразу несколько чисел (штук 10), а потом уже извлекать
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 12:32  [ТС]     Стек на шаблонах - оцените реализацию #42
uglyPinokkio, не понял че там за тема с массивом? чем его заполнять и зачем?
Цитата Сообщение от castaway Посмотреть сообщение
Зачем спраживать чужое мнение если не планируешь к нему прислушиваться?
ну почему же, как видите изначально у меня был совсем другой код... я просто никому не верю на слово и мне нужны очень веские доводы чтобы поменять мое мнение, меня можно переспорить только доводами такой я человек

Добавлено через 49 секунд
Хедин, а вот и первый стоящий довод... действительно не юзал это так, сейчас попробовал и ошибка, был не прав буду думать...
Хедин
73 / 68 / 36
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 12:32     Стек на шаблонах - оцените реализацию #43
GetHelp, вы тестируете стек некорректно, вот у вас и работает.
Код:
C++
1
2
3
4
5
6
7
8
9
10
11
int main()
{
    Stack <vect> x;
    for (int i = 0; i < 5; i++)
    {
        vect tmp = {i+1, i-1, i-2};
        x.Push(tmp);
        cout << x.Pop().x << endl;
    }
    return 0;
}
а вот
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    Stack <vect> x;
    for (int i = 0; i < 5; i++)
    {
        vect tmp = {i+1, i-1, i-2};
        x.Push(tmp);
    }
    for (int i = 0; i < 5; i++)
    {
        cout << x.Pop().x << endl;
    }
    return 0;
}
наворачивается
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 12:33  [ТС]     Стек на шаблонах - оцените реализацию #44
а собственно интересует меня следующее: что конкретно делает функция new? это же ведь только обертка под malloc вроде? а что делает malloc? меня просто интересует можно ли как то выделить память в заданном месте памяти (т.е. рядом с предыдущими членами стека)?

Добавлено через 20 секунд
Хедин, да да я так уже попробовал и все ясно...
Хедин
73 / 68 / 36
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 12:36     Стек на шаблонах - оцените реализацию #45
GetHelp, она выделяет участок памяти в куче, подходящего размера. А у вас получается странная штука... выделили память в куче, сместились в этой же куче на позицию (и хрен знает, что там было уже записано), перезаписали новый адрес в эту позицию, снова куда то улетели по выделенному адресу (а может и в тот же самый участок памяти попали)
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 12:40  [ТС]     Стек на шаблонах - оцените реализацию #46
Хедин, ну это понятно, но как именно она это делает? где исходники глянуть можно? и можно ли как то реализовать выделение памяти именно по тому адресу (указателю) где я хочу, ну и соответственно размер задается типом

Добавлено через 1 минуту
Цитата Сообщение от Хедин Посмотреть сообщение
А у вас получается странная штука... выделили память в куче, сместились в этой же куче на позицию (и хрен знает, что там было уже записано), перезаписали новый адрес в эту позицию, снова куда то улетели по выделенному адресу (а может и в тот же самый участок памяти попали)
так мы кажется определились что она выделяет память каждый раз в рандомном месте? или все же нет?

Добавлено через 1 минуту
ладно похож правда придется копать в сторону списка...
Хедин
73 / 68 / 36
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 12:41     Стек на шаблонах - оцените реализацию #47
GetHelp, неправильно уже даже то, что вы записываете смещения указателя непонятно куда. Там могут быть и чьи то данные, память то не помечена, как выделенная
Ilot
Модератор
Эксперт С++
1785 / 1160 / 225
Регистрация: 16.05.2013
Сообщений: 3,056
Записей в блоге: 5
Завершенные тесты: 1
17.07.2014, 12:41     Стек на шаблонах - оцените реализацию #48
Цитата Сообщение от GetHelp Посмотреть сообщение
Хедин, ну это понятно, но как именно она это делает? где исходники глянуть можно? и можно ли как то реализовать выделение памяти именно по тому адресу (указателю) где я хочу, ну и соответственно размер задается типом
Выделение памяти выполняется операционной системой. В Windows это HeapAlloc.
Цитата Сообщение от GetHelp Посмотреть сообщение
так мы кажется определились что она выделяет память каждый раз в рандомном месте? или все же нет?
Нет.
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
17.07.2014, 12:49     Стек на шаблонах - оцените реализацию #49
Цитата Сообщение от GetHelp Посмотреть сообщение
не понял че там за тема с массивом? чем его заполнять и зачем?
Отсюда:

http://wm-help.net/books-online/book/59464/59464-6.html

И до конца главы 18. Для осознания грубой реальности.
stima
17.07.2014, 12:59
  #50

Не по теме:

Не знаю почему, но подняло настроение с утра. Жду продолжение. Ушел за кофе.

Хедин
17.07.2014, 13:25
  #51

Не по теме:

uglyPinokkio, бунтарь и сокрушитель стереотипов

GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 18:26  [ТС]     Стек на шаблонах - оцените реализацию #52
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Отсюда:
http://wm-help.net/books-online/book/59464/59464-6.html
И до конца главы 18. Для осознания грубой реальности.
реально офигенная книжка

Цитата Сообщение от stima Посмотреть сообщение
Не знаю почему, но подняло настроение с утра. Жду продолжение. Ушел за кофе.
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 18:27  [ТС]     Стек на шаблонах - оцените реализацию #53
итак встречайте продолжение саги Стек часть 2: Списки

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
template <typename T>
class Stack
{
private:
    struct NODE
    {
        T data;
        NODE *prev;
    } *head;
public:
    Stack();
    ~Stack();
    void Push(T value);
    T *Pop();
};
 
template <typename T>
Stack<T>::Stack()
{
    head = nullptr;
}
 
template <typename T>
Stack<T>::~Stack()
{
    while (head)
    {
        NODE *tmp = head->prev;
        delete head;
        head = tmp;
    }
}
 
template <typename T>
void Stack<T>::Push(T value)
{
    NODE *tmp = new NODE;
    tmp->data = value;
    tmp->prev = head;
    head = tmp;
}
 
template <typename T>
T* Stack<T>::Pop()
{
    if (!head) return nullptr;
    T *value = new T;
    *value = head->data;
    head = head->prev;
    return value;
}
Миниатюры
Стек на шаблонах - оцените реализацию  
Vourhey
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.07.2014, 18:42     Стек на шаблонах - оцените реализацию #54
В частности, теряешь указатели в Pop, будут утечки памяти. Ну и создавать там что-то, и возвращать указатель - хз, на что понадобилось.
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 18:45  [ТС]     Стек на шаблонах - оцените реализацию #55
Цитата Сообщение от Vourhey Посмотреть сообщение
В частности, теряешь указатели в Pop, будут утечки памяти. Ну и создавать там что-то, и возвращать указатель - хз, на что понадобилось.
а да и правда потерял, вот так исправил

C++
1
2
3
4
5
6
7
8
9
10
11
template <typename T>
T* Stack<T>::Pop()
{
    if (!head) return nullptr;
    T *value = new T;
    *value = head->data;
    NODE *tmp = head;
    head = head->prev;
    delete tmp;
    return value;
}
а указатель возвращает потому что надо было как то обозначить ошибку при вызове Pop с пустым стеком...
0x10
2455 / 1627 / 238
Регистрация: 24.11.2012
Сообщений: 4,003
17.07.2014, 18:50     Стек на шаблонах - оцените реализацию #56
Цитата Сообщение от GetHelp Посмотреть сообщение
а указатель возвращает потому что надо было как то обозначить ошибку при вызове Pop с пустым стеком...
В стеке из стандартной библиотеки pop ничего не возвращает - http://www.cplusplus.com/reference/stack/stack/pop/
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 18:53  [ТС]     Стек на шаблонах - оцените реализацию #57
Цитата Сообщение от 0x10 Посмотреть сообщение
В стеке из стандартной библиотеки pop ничего не возвращает - http://www.cplusplus.com/reference/stack/stack/pop/
не знал про такую штуку... но как то не логично ничего не возвращать... ведь должен же быть доступ к голове стека, иначе зачем вообще он нужен...
0x10
2455 / 1627 / 238
Регистрация: 24.11.2012
Сообщений: 4,003
17.07.2014, 18:55     Стек на шаблонах - оцените реализацию #58
Цитата Сообщение от GetHelp Посмотреть сообщение
ведь должен же быть доступ к голове стека
http://www.cplusplus.com/reference/stack/stack/top/
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 18:59  [ТС]     Стек на шаблонах - оцените реализацию #59
Цитата Сообщение от 0x10 Посмотреть сообщение
http://www.cplusplus.com/reference/stack/stack/top/
да ну еще... кому это надо? я не могу представить где такое может пригодится... собственно вот у меня например с чего началась вся эта ерунда со стеками: в лабе по графике (алгоритм заливки) надо было реализовать стек в который добавлялись точки, я тогда извратился через массивы с постоянным перевыделением памяти и тип там был только POINT, но захотелось сделать нормальный стек и вот он сделан так вот к чему я это, если используется стек, то обычно при доступе к вершине стека заодно надо и удалить эту вершину, так что нет особого смысла делать для этого 2 функции...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2014, 19:03     Стек на шаблонах - оцените реализацию
Еще ссылки по теме:

C++ Класс на шаблонах, менять аргументы шаблона
Ищу реализацию 2-3-4 дерева C++
Дружественные функции в шаблонах C++
Typename в шаблонах класса C++
Приведение одного парметра-типа к другому разыменованному парметру-типу (указателю) в шаблонах C++

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

Или воспользуйтесь поиском по форуму:
0x10
2455 / 1627 / 238
Регистрация: 24.11.2012
Сообщений: 4,003
17.07.2014, 19:03     Стек на шаблонах - оцените реализацию #60
Цитата Сообщение от GetHelp Посмотреть сообщение
нет особого смысла делать для этого 2 функции...
Сам же уперся в то, что не знаешь что возвращать из функции pop. Ссылку нельзя - поскольку объект с вершины должен быть удален. Указатель - тоже нельзя, потенциальные утечки. Копию - необоснованные накладные расходы.
Yandex
Объявления
17.07.2014, 19:03     Стек на шаблонах - оцените реализацию
Закрытая тема Создать тему
Опции темы

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