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

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

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

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

17.07.2014, 00:21. Просмотров 3213. Ответов 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++ Подстановка вычисляемого типа в шаблонах
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.07.2014, 00:26     Стек на шаблонах - оцените реализацию #2
Цитата Сообщение от GetHelp Посмотреть сообщение
data = new T;
Память выделил под один элемент.
Цитата Сообщение от GetHelp Посмотреть сообщение
size = sizeof(T);
Цитата Сообщение от GetHelp Посмотреть сообщение
data = data + size;
Что это? указатель на следующий элемент это указатель + 1.
Цитата Сообщение от GetHelp Посмотреть сообщение
*data = value;
Когда-нибудь грохнется, потому что пишешь вне выделенной области.
И в других функциях такая же жесть у тебя с указателями.
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 00:28  [ТС]     Стек на шаблонах - оцените реализацию #3
Цитата Сообщение от Vourhey Посмотреть сообщение
Память выделил под один элемент.
так и задумано, new используется только для инициализации, дабы было от чего считать смещение

Цитата Сообщение от Vourhey Посмотреть сообщение
Что это? указатель на следующий элемент это указатель + 1.
почему +1? разные типы весят по разному как бы...

Добавлено через 34 секунды
Цитата Сообщение от Vourhey Посмотреть сообщение
Когда-нибудь грохнется, потому что пишешь вне выделенной области.
а чем это плохо?
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.07.2014, 00:30     Стек на шаблонах - оцените реализацию #4
Цитата Сообщение от GetHelp Посмотреть сообщение
new используется только для инициализации
Блин, а в какой области памяти элементы твоего стека будут располагаться, ты подумал?
Цитата Сообщение от GetHelp Посмотреть сообщение
почему +1?
Потому что.
Цитата Сообщение от GetHelp Посмотреть сообщение
разные типы весят по разному как бы...
Цитата Сообщение от GetHelp Посмотреть сообщение
разные типы весят по разному как бы...
Какая разница, какой размер памяти у типа. Почитай про адресную арифметику.

Добавлено через 57 секунд
Цитата Сообщение от GetHelp Посмотреть сообщение
а чем это плохо?
Чем плохо то, что программа упадет? Сам никак не догадаешься?
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 00:31  [ТС]     Стек на шаблонах - оцените реализацию #5
Цитата Сообщение от Vourhey Посмотреть сообщение
Блин, а в какой области памяти элементы твоего стека будут располагаться ты подумал?
элементы стека идут друг за другом, не все ли равно где они пишутся? память безгранична, просто что то может перезаписаться

Цитата Сообщение от Vourhey Посмотреть сообщение
Какая разница, какой размер памяти у типа. Почитай про адресную арифметику.
почитаю
Jupiter
Каратель
Эксперт C++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.07.2014, 00:36     Стек на шаблонах - оцените реализацию #6
Цитата Сообщение от GetHelp Посмотреть сообщение
C++
1
Push(T value)
передача по значению

Цитата Сообщение от GetHelp Посмотреть сообщение
C++
1
2
3
4
template <typename T>
T Stack<T>::Pop()
{
   int tmp = *data;
какой int ?
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.07.2014, 00:36     Стек на шаблонах - оцените реализацию #7
Цитата Сообщение от GetHelp Посмотреть сообщение
элементы стека идут друг за другом, не все ли равно где они пишутся?
Нет, не все равно.
Цитата Сообщение от GetHelp Посмотреть сообщение
память безгранична
ОС считает иначе.
Цитата Сообщение от GetHelp Посмотреть сообщение
просто что то может перезаписаться
Ничего не перезапишется. Твой указатель выйдет за выделенную область и программа просто грохнется.
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 00:40  [ТС]     Стек на шаблонах - оцените реализацию #8
Цитата Сообщение от Jupiter Посмотреть сообщение
какой int ?
ой точно спс, просто очепятка, там T должно быть

Добавлено через 1 минуту
Цитата Сообщение от Vourhey Посмотреть сообщение
Ничего не перезапишется. Твой указатель выйдет за выделенную область и программа просто грохнется.
ну я потестил и ничего не грохалось...

Добавлено через 19 секунд
собственно приведите код при котором оно грохнется
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.07.2014, 00:41     Стек на шаблонах - оцените реализацию #9
Добавлено через 53 секунды
Цитата Сообщение от GetHelp Посмотреть сообщение
ну я потестил и ничего не грохалось...
И что? Я же написал условие, когда она упадет. Ты посмотри на код свой. Он неправильный.
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 00:42  [ТС]     Стек на шаблонах - оцените реализацию #10
В общем я понял твою оценку, но не увидел весомых доводов в пользу каких бы то ни было исправлений (кроме той опечятки )
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.07.2014, 00:47     Стек на шаблонах - оцените реализацию #11
Цитата Сообщение от GetHelp Посмотреть сообщение
собственно приведите код при котором оно грохнется
Вот достал...
Такой, думаю, может упасть:
C++
1
2
3
4
5
6
7
8
9
10
struct A
{
    long double a,b,c,d,e,f,g,h,i,j;
};
 
...
    A r;
    Stack<A> a;
    for(int i = 0;i < 5000; ++i)
        a.Push(r);
Добавлено через 1 минуту
Цитата Сообщение от GetHelp Посмотреть сообщение
но не увидел весомых доводов в пользу каких бы то ни было исправлений
Довод один - у тебя не выделена область памяти под элементы. Что делает код твоей программы ошибочным. Че те еще надо?

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от GetHelp Посмотреть сообщение
а ты точно модер?
Нет, Марта Стюарт.

GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 00:49  [ТС]     Стек на шаблонах - оцените реализацию #12
Цитата Сообщение от Vourhey Посмотреть сообщение
Вот достал...
Такой, думаю, может упасть:
а r кто будет инициализировать? Пушкин?
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.07.2014, 00:52     Стек на шаблонах - оцените реализацию #13
Цитата Сообщение от GetHelp Посмотреть сообщение
а r кто будет инициализировать?
Нафига ее инициализировать-то? давай, инициализируй. Разницы никакой. Размер структуры один и тот же в любом виде. Для копирования не имеет значения, чем и как инициализированы в ней данные.

Добавлено через 1 минуту
Цитата Сообщение от GetHelp Посмотреть сообщение
Пушкин?
Пушкин те программу писал...
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 00:59  [ТС]     Стек на шаблонах - оцените реализацию #14
Цитата Сообщение от Vourhey Посмотреть сообщение
Нафига ее инициализировать-то? давай, инициализируй. Разницы никакой.
ну наверное потому что без инициализация она не запустится

хмм брякается... возможно тут еще дело в том что подается структура... хотя по идее оно должно и с ними работать... попробовал чисто
C
1
2
3
Stack <int> a;
    for (int i = 0; i < 5000; i++)
        a.Push(i);
брякнулось на 448 элементе да уж печально это как то... а как предложите переделать? выделять память сразу на n-ое количество элементов? а дальше? просто мне казалось что стек штука резиновая, т.е. которая не ограничивается изначально заданным количеством... взять хотя бы стек в ассемблере...
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.07.2014, 01:05     Стек на шаблонах - оцените реализацию #15
Цитата Сообщение от GetHelp Посмотреть сообщение
ну наверное потому что без инициализация она не запустится
Запустится. Просто в данных будет мусор. Но для того, чтобы уронить это не важно.
Цитата Сообщение от GetHelp Посмотреть сообщение
хмм брякается...
Ух как неожиданно, е-мое
Цитата Сообщение от GetHelp Посмотреть сообщение
возможно тут еще дело в том что подается структура...
Ну, конечно, да-да-да. Структуру я взял просто так. Можешь интов туда напихать. ТОже грохнется на определнном моменте. Хоть чаров.
Цитата Сообщение от GetHelp Посмотреть сообщение
а как предложите переделать?
Хах. Ну, например, на списках стек можно реализовать.
Цитата Сообщение от GetHelp Посмотреть сообщение
выделять память сразу на n-ое количество элементов?
Ага, и после n будешь пушить и опять будет грохаться, если памяти не добавишь.
Цитата Сообщение от GetHelp Посмотреть сообщение
просто мне казалось что стек штука резиновая, т.е. которая не ограничивается изначально заданным количеством..
Правильно тебе казалось. Поэтому тебе нужно попить чайку, подумать, как сделать так, чтобы под новые элементы память выделялась динамически, если ее нема уже выделенной.
Цитата Сообщение от GetHelp Посмотреть сообщение
взять хотя бы стек в ассемблере...
Стек в ассемблере, если бы был резиновый, то о stack overflow никто бы не знал. Ну и стек в ассемблере, например, на винде так же увеличивает свой доступный "размер", когда ты пушаешь на страницы, которые под него еще не выделены. Но ты этого просто не видишь. И к теме это не относится.
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 01:08  [ТС]     Стек на шаблонах - оцените реализацию #16
Цитата Сообщение от Vourhey Посмотреть сообщение
Запустится.
не запустится, выбивает ошибку "Run-Time Check Failure #3 - The variable 'r' is being used without being initialized."
Цитата Сообщение от Vourhey Посмотреть сообщение
Хах. Ну, например, на списках стек можно реализовать.
че это? о_О
Цитата Сообщение от Vourhey Посмотреть сообщение
Ага, и после n будешь пушить и опять будет грохаться, если памяти не добавишь.
да пробовал я еще изначально так, но это как то тупо и не красиво выходит, т.к. каждый раз перевыделять память на 1 элемент... как то тупо...
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.07.2014, 01:16     Стек на шаблонах - оцените реализацию #17
Цитата Сообщение от GetHelp Посмотреть сообщение
не запустится, выбивает ошибку "Run-Time Check Failure #3 - The variable 'r' is being used without being initialized."
Это ты к своему компилятору обратись. Пользоваться неинициализироваными данными никто не запрещает.
Тем более, что в приведенном мной примере стоит ..., что означает "любой код". Можешь в нем писать, че хочешь. Если твоему компилятору не нравится - инициализируй. Как я уже сказал, ничего от этого не изменится - прога твоя упадет. А ты пытаешься обратить внимание на какие-то левые вещи.
Цитата Сообщение от GetHelp Посмотреть сообщение
че это? о_О
Почитай, опять же. Как и про адресную арифметику.
Цитата Сообщение от GetHelp Посмотреть сообщение
но это как то тупо и не красиво выходит
Сделай красиво, кто мешает?
Цитата Сообщение от GetHelp Посмотреть сообщение
каждый раз перевыделять память на 1 элемент.
И твое решение было - поэтому давай совсем не выделять

Добавлено через 1 минуту
Из крайности в крайность. Либо выделять под все сразу, либо не выделять вообще. Третьего не дано.
ууууффф, ты жжОшь )
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 01:21  [ТС]     Стек на шаблонах - оцените реализацию #18
Vourhey, ааа вот загуглил про списки, наверное это то что нужно, вот скажем первая ссылка с гугла, все довольно просто http://learnc.info/adt/linked_list.html

Добавлено через 35 секунд
утром попробую
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.07.2014, 01:29     Стек на шаблонах - оцените реализацию #19
GetHelp, типа того, да, как вариант.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2014, 08:14     Стек на шаблонах - оцените реализацию
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 08:14  [ТС]     Стек на шаблонах - оцените реализацию #20
щас еще не пытался делать через списки, пришла просто в голову мысль как улучшить свой вариант

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
template <typename T>
class Stack
{
private:
    size_t size;
    size_t count;
    T* data;
public:
    Stack();
    ~Stack();
    void Push(T value);
    T Pop();
};
 
template <typename T>
Stack<T>::Stack()
{
    size = sizeof(T);
    data = new T;
    count = 1;
}
 
template <typename T>
Stack<T>::~Stack()
{
    T* ptr = data;
    for(int i = 0; i < count; i++)
        delete (ptr -= size);
}
 
template <typename T>
void Stack<T>::Push(T value)
{
    data += size;
    data = new T;
    *data = value;
    count++;
}
 
template <typename T>
T Stack<T>::Pop()
{
    count--;
    T tmp = *data;
    T* ptr = data;
    data -= size;
    delete ptr;
    return tmp;
}
вот, только вылетает с ошибкой при вызове деструктора...
Миниатюры
Стек на шаблонах - оцените реализацию  
Yandex
Объявления
17.07.2014, 08:14     Стек на шаблонах - оцените реализацию
Закрытая тема Создать тему
Опции темы

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