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

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

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

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

17.07.2014, 00:21. Просмотров 3509. Ответов 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 (т.е. предыдущий и следующий элементы) потом забил, толку с них никакого, все равно по смещению ищу значение
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2014, 00:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Стек на шаблонах - оцените реализацию (C++):

пытаюсь сделать реализацию через считывание из файла кол-ва чисел, i,но незнаю как сделать реализацию из файла в массив и сортировки. - C++
В файле input.txt находится неизвестное количество вещественных чисел в интервале . Выцапарать их оттуда, отсортировать по убыванию модуля...

ошибка в шаблонах функций - C++
Есть у меня программа из нескольких файлов . с шаблонами для функций ... компилятор выдает следующий ошибку -&gt; &quot;/main.cpp:17: undefined...

Дружественные функции в шаблонах - C++
Как использовать дружественные функции в шаблонах? ( C++ Builder)

Typename в шаблонах класса - C++
В таком шаблоне: template &lt;typename T, int n, bool islong=???&gt; class CounterA{... требуется распознать тип, то есть переменная islong...

Вопрос по исключениям в шаблонах классов - C++
Кто подскажет как реализовать исключения в следующей задаче: Создать шаблонный класс, в котором создать одномерный массив и найти...

Доступ к элементам tuple в шаблонах - C++
Собственно, не могу понять как работать с элементами кортежа в цикле, не получается получить к ним доступ. Подскажите, кто знает, как это...

101
Vourhey
Почетный модератор
6485 / 2259 / 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;
Когда-нибудь грохнется, потому что пишешь вне выделенной области.
И в других функциях такая же жесть у тебя с указателями.
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 00:28  [ТС] #3
Цитата Сообщение от Vourhey Посмотреть сообщение
Память выделил под один элемент.
так и задумано, new используется только для инициализации, дабы было от чего считать смещение

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

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

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

Цитата Сообщение от Vourhey Посмотреть сообщение
Какая разница, какой размер памяти у типа. Почитай про адресную арифметику.
почитаю
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 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 ?
0
Vourhey
Почетный модератор
6485 / 2259 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.07.2014, 00:36 #7
Цитата Сообщение от GetHelp Посмотреть сообщение
элементы стека идут друг за другом, не все ли равно где они пишутся?
Нет, не все равно.
Цитата Сообщение от GetHelp Посмотреть сообщение
память безгранична
ОС считает иначе.
Цитата Сообщение от GetHelp Посмотреть сообщение
просто что то может перезаписаться
Ничего не перезапишется. Твой указатель выйдет за выделенную область и программа просто грохнется.
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 00:40  [ТС] #8
Цитата Сообщение от Jupiter Посмотреть сообщение
какой int ?
ой точно спс, просто очепятка, там T должно быть

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

Добавлено через 19 секунд
собственно приведите код при котором оно грохнется
0
Vourhey
Почетный модератор
6485 / 2259 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.07.2014, 00:41 #9
Добавлено через 53 секунды
Цитата Сообщение от GetHelp Посмотреть сообщение
ну я потестил и ничего не грохалось...
И что? Я же написал условие, когда она упадет. Ты посмотри на код свой. Он неправильный.
1
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 00:42  [ТС] #10
В общем я понял твою оценку, но не увидел весомых доводов в пользу каких бы то ни было исправлений (кроме той опечятки )
0
Vourhey
Почетный модератор
6485 / 2259 / 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 Посмотреть сообщение
а ты точно модер?
Нет, Марта Стюарт.

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

Добавлено через 1 минуту
Цитата Сообщение от GetHelp Посмотреть сообщение
Пушкин?
Пушкин те программу писал...
1
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-ое количество элементов? а дальше? просто мне казалось что стек штука резиновая, т.е. которая не ограничивается изначально заданным количеством... взять хотя бы стек в ассемблере...
0
Vourhey
Почетный модератор
6485 / 2259 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.07.2014, 01:05 #15
Цитата Сообщение от GetHelp Посмотреть сообщение
ну наверное потому что без инициализация она не запустится
Запустится. Просто в данных будет мусор. Но для того, чтобы уронить это не важно.
Цитата Сообщение от GetHelp Посмотреть сообщение
хмм брякается...
Ух как неожиданно, е-мое
Цитата Сообщение от GetHelp Посмотреть сообщение
возможно тут еще дело в том что подается структура...
Ну, конечно, да-да-да. Структуру я взял просто так. Можешь интов туда напихать. ТОже грохнется на определнном моменте. Хоть чаров.
Цитата Сообщение от GetHelp Посмотреть сообщение
а как предложите переделать?
Хах. Ну, например, на списках стек можно реализовать.
Цитата Сообщение от GetHelp Посмотреть сообщение
выделять память сразу на n-ое количество элементов?
Ага, и после n будешь пушить и опять будет грохаться, если памяти не добавишь.
Цитата Сообщение от GetHelp Посмотреть сообщение
просто мне казалось что стек штука резиновая, т.е. которая не ограничивается изначально заданным количеством..
Правильно тебе казалось. Поэтому тебе нужно попить чайку, подумать, как сделать так, чтобы под новые элементы память выделялась динамически, если ее нема уже выделенной.
Цитата Сообщение от GetHelp Посмотреть сообщение
взять хотя бы стек в ассемблере...
Стек в ассемблере, если бы был резиновый, то о stack overflow никто бы не знал. Ну и стек в ассемблере, например, на винде так же увеличивает свой доступный "размер", когда ты пушаешь на страницы, которые под него еще не выделены. Но ты этого просто не видишь. И к теме это не относится.
0
17.07.2014, 01:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2014, 01:05
Привет! Вот еще темы с ответами:

Подстановка вычисляемого типа в шаблонах - C++
Товарищи. Помогите разобраться с шаблонами. С шаблонами начал разбираться вчера, и потому излагаю задачу полностью, дабы не быть...

Тип, зависимый от условия в шаблонах - C++
Возможно ли реализовать подобное: template &lt;uint8_t bits&gt; class test { // если bits &lt;= 8 typedef uint8_t storageType; //...

Используя стек, описать функцию проверяющую, является ли стек пустым - C++
Используя стек, описать функцию проверяющую, является ли стек пустым

Программа добавляет введенный массив 5*5 в стек и выводит полученный стек двумя столбцами - C++
Программа добавляет введенный массив 5*5 в стек и выводит полученный стек двумя столбцами #include &lt;iostream&gt; #include &lt;stdlib.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
15
Закрытая тема Создать тему
Опции темы

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