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

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

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

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

17.07.2014, 00:21. Просмотров 3481. Ответов 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
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 12:40  [ТС] #46
Хедин, ну это понятно, но как именно она это делает? где исходники глянуть можно? и можно ли как то реализовать выделение памяти именно по тому адресу (указателю) где я хочу, ну и соответственно размер задается типом

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

Добавлено через 1 минуту
ладно похож правда придется копать в сторону списка...
0
Хедин
73 / 68 / 36
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 12:41 #47
GetHelp, неправильно уже даже то, что вы записываете смещения указателя непонятно куда. Там могут быть и чьи то данные, память то не помечена, как выделенная
0
Ilot
Модератор
Эксперт С++
1820 / 1178 / 232
Регистрация: 16.05.2013
Сообщений: 3,115
Записей в блоге: 5
Завершенные тесты: 1
17.07.2014, 12:41 #48
Цитата Сообщение от GetHelp Посмотреть сообщение
Хедин, ну это понятно, но как именно она это делает? где исходники глянуть можно? и можно ли как то реализовать выделение памяти именно по тому адресу (указателю) где я хочу, ну и соответственно размер задается типом
Выделение памяти выполняется операционной системой. В Windows это HeapAlloc.
Цитата Сообщение от GetHelp Посмотреть сообщение
так мы кажется определились что она выделяет память каждый раз в рандомном месте? или все же нет?
Нет.
0
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. Для осознания грубой реальности.
0
stima
17.07.2014, 12:59
  #50

Не по теме:

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

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

Не по теме:

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

0
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 Посмотреть сообщение
Не знаю почему, но подняло настроение с утра. Жду продолжение. Ушел за кофе.
0
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;
}
0
Миниатюры
Стек на шаблонах - оцените реализацию  
Vourhey
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.07.2014, 18:42 #54
В частности, теряешь указатели в Pop, будут утечки памяти. Ну и создавать там что-то, и возвращать указатель - хз, на что понадобилось.
0
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 с пустым стеком...
0
0x10
2465 / 1637 / 241
Регистрация: 24.11.2012
Сообщений: 4,041
17.07.2014, 18:50 #56
Цитата Сообщение от GetHelp Посмотреть сообщение
а указатель возвращает потому что надо было как то обозначить ошибку при вызове Pop с пустым стеком...
В стеке из стандартной библиотеки pop ничего не возвращает - http://www.cplusplus.com/reference/stack/stack/pop/
0
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/
не знал про такую штуку... но как то не логично ничего не возвращать... ведь должен же быть доступ к голове стека, иначе зачем вообще он нужен...
0
0x10
2465 / 1637 / 241
Регистрация: 24.11.2012
Сообщений: 4,041
17.07.2014, 18:55 #58
Цитата Сообщение от GetHelp Посмотреть сообщение
ведь должен же быть доступ к голове стека
http://www.cplusplus.com/reference/stack/stack/top/
0
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 функции...
0
0x10
2465 / 1637 / 241
Регистрация: 24.11.2012
Сообщений: 4,041
17.07.2014, 19:03 #60
Цитата Сообщение от GetHelp Посмотреть сообщение
нет особого смысла делать для этого 2 функции...
Сам же уперся в то, что не знаешь что возвращать из функции pop. Ссылку нельзя - поскольку объект с вершины должен быть удален. Указатель - тоже нельзя, потенциальные утечки. Копию - необоснованные накладные расходы.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2014, 19:03
Привет! Вот еще темы с ответами:

Подстановка вычисляемого типа в шаблонах - 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; ...


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

Или воспользуйтесь поиском по форуму:
60
Yandex
Объявления
17.07.2014, 19:03
Закрытая тема Создать тему
Опции темы

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