Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.81/32: Рейтинг темы: голосов - 32, средняя оценка - 4.81
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116

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

17.07.2014, 00:21. Показов 7536. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.07.2014, 00:21
Ответы с готовыми решениями:

Сделать реализацию list (классы node и list) на шаблонах
Помогите написать прогу Необходимо: Сделать реализацию list (классы node и list) на шаблонах. 1.push_back 2.push_front 3.size ...

Оцените реализацию внедрения зависимостей
Собственно захотелось простенький вариант, ибо особо не нужно и не хочется тащить нормальные библы, мне не нужно и десятой части из того...

Оцените реализацию Угадывателя чисел
И вопрос на засыпку, можно ли как то максимально оптимизировать данный процесс? Если да, то как. Понимаю, книги и все такое , но вместе с...

101
 Аватар для Хедин
76 / 71 / 55
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 12:20
Студворк — интернет-сервис помощи студентам
GetHelp, код ваш покажите. Посмотрел код на вашем примере и, по моему, понимаю, почему у вас не крашится. В стеке у вас всегда находится не больше 1 элемента, попробуйте туда записать сразу несколько чисел (штук 10), а потом уже извлекать
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
17.07.2014, 12:32  [ТС]
uglyPinokkio, не понял че там за тема с массивом? чем его заполнять и зачем?
Цитата Сообщение от castaway Посмотреть сообщение
Зачем спраживать чужое мнение если не планируешь к нему прислушиваться?
ну почему же, как видите изначально у меня был совсем другой код... я просто никому не верю на слово и мне нужны очень веские доводы чтобы поменять мое мнение, меня можно переспорить только доводами такой я человек

Добавлено через 49 секунд
Хедин, а вот и первый стоящий довод... действительно не юзал это так, сейчас попробовал и ошибка, был не прав буду думать...
0
 Аватар для Хедин
76 / 71 / 55
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 12:32
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;
}
наворачивается
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
17.07.2014, 12:33  [ТС]
а собственно интересует меня следующее: что конкретно делает функция new? это же ведь только обертка под malloc вроде? а что делает malloc? меня просто интересует можно ли как то выделить память в заданном месте памяти (т.е. рядом с предыдущими членами стека)?

Добавлено через 20 секунд
Хедин, да да я так уже попробовал и все ясно...
0
 Аватар для Хедин
76 / 71 / 55
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 12:36
GetHelp, она выделяет участок памяти в куче, подходящего размера. А у вас получается странная штука... выделили память в куче, сместились в этой же куче на позицию (и хрен знает, что там было уже записано), перезаписали новый адрес в эту позицию, снова куда то улетели по выделенному адресу (а может и в тот же самый участок памяти попали)
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
17.07.2014, 12:40  [ТС]
Хедин, ну это понятно, но как именно она это делает? где исходники глянуть можно? и можно ли как то реализовать выделение памяти именно по тому адресу (указателю) где я хочу, ну и соответственно размер задается типом

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

Добавлено через 1 минуту
ладно похож правда придется копать в сторону списка...
0
 Аватар для Хедин
76 / 71 / 55
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 12:41
GetHelp, неправильно уже даже то, что вы записываете смещения указателя непонятно куда. Там могут быть и чьи то данные, память то не помечена, как выделенная
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2226 / 1428 / 420
Регистрация: 16.05.2013
Сообщений: 3,651
Записей в блоге: 6
17.07.2014, 12:41
Цитата Сообщение от GetHelp Посмотреть сообщение
Хедин, ну это понятно, но как именно она это делает? где исходники глянуть можно? и можно ли как то реализовать выделение памяти именно по тому адресу (указателю) где я хочу, ну и соответственно размер задается типом
Выделение памяти выполняется операционной системой. В Windows это HeapAlloc.
Цитата Сообщение от GetHelp Посмотреть сообщение
так мы кажется определились что она выделяет память каждый раз в рандомном месте? или все же нет?
Нет.
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
17.07.2014, 12:49
Цитата Сообщение от GetHelp Посмотреть сообщение
не понял че там за тема с массивом? чем его заполнять и зачем?
Отсюда:

http://wm-help.net/books-onlin... 464-6.html

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

Не по теме:

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

0
17.07.2014, 13:25

Не по теме:

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

0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
17.07.2014, 18:26  [ТС]
Цитата Сообщение от uglyPinokkio Посмотреть сообщение
Отсюда:
http://wm-help.net/books-onlin... 464-6.html
И до конца главы 18. Для осознания грубой реальности.
реально офигенная книжка

Цитата Сообщение от stima Посмотреть сообщение
Не знаю почему, но подняло настроение с утра. Жду продолжение. Ушел за кофе.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
17.07.2014, 18:27  [ТС]
итак встречайте продолжение саги Стек часть 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
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
17.07.2014, 18:42
В частности, теряешь указатели в Pop, будут утечки памяти. Ну и создавать там что-то, и возвращать указатель - хз, на что понадобилось.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
17.07.2014, 18:45  [ТС]
Цитата Сообщение от 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
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
17.07.2014, 18:50
Цитата Сообщение от GetHelp Посмотреть сообщение
а указатель возвращает потому что надо было как то обозначить ошибку при вызове Pop с пустым стеком...
В стеке из стандартной библиотеки pop ничего не возвращает - http://www.cplusplus.com/refer... stack/pop/
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
17.07.2014, 18:53  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
В стеке из стандартной библиотеки pop ничего не возвращает - http://www.cplusplus.com/refer... stack/pop/
не знал про такую штуку... но как то не логично ничего не возвращать... ведь должен же быть доступ к голове стека, иначе зачем вообще он нужен...
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
17.07.2014, 18:55
Цитата Сообщение от GetHelp Посмотреть сообщение
ведь должен же быть доступ к голове стека
http://www.cplusplus.com/refer... stack/top/
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
17.07.2014, 18:59  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
http://www.cplusplus.com/reference/stack/stack/top/
да ну еще... кому это надо? я не могу представить где такое может пригодится... собственно вот у меня например с чего началась вся эта ерунда со стеками: в лабе по графике (алгоритм заливки) надо было реализовать стек в который добавлялись точки, я тогда извратился через массивы с постоянным перевыделением памяти и тип там был только POINT, но захотелось сделать нормальный стек и вот он сделан так вот к чему я это, если используется стек, то обычно при доступе к вершине стека заодно надо и удалить эту вершину, так что нет особого смысла делать для этого 2 функции...
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
17.07.2014, 19:03
Цитата Сообщение от GetHelp Посмотреть сообщение
нет особого смысла делать для этого 2 функции...
Сам же уперся в то, что не знаешь что возвращать из функции pop. Ссылку нельзя - поскольку объект с вершины должен быть удален. Указатель - тоже нельзя, потенциальные утечки. Копию - необоснованные накладные расходы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.07.2014, 19:03

Оцените реализацию вертикального списка
Сделал вертикальный список с навигацией по стрелкам клавиатуры. https://jsfiddle.net/Ucorp/cuhkmxe0/9/ Буду рад услышать ваше...

Оцените реализацию классов с использованием наследования
Программируя, я никогда раньше не пользовался наследованием классов и всем, что к этому относится и решил подтянуть себя в этой теме....

Программа для шифрования файлов в один контейнер. Оцените реализацию
Приветствую. Написал свою первую программу. Суть такая: Выбираются файлы, добавляются в контейнер(zip) и потом этот контейнер шифруется...

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

Ошыбка на шаблонах
Простая проблемка, но никак не могу понять почему оно не работет. Выдает ошибку: Notice: Undefined variable: products in...


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

Или воспользуйтесь поиском по форуму:
60
Закрытая тема Создать тему
Новые блоги и статьи
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
Сукцессия 20. Война автоботов. Делаем ставки. Лёд против "пш-пш!".
anaschu 11.07.2026
Битва ИИ в ризосфере: Как мы скрестили жесткие ОДУ, закон Фика и «подземный шантаж» Уважаемые коллеги! Хочу поделиться уникальным опытом ведения междисциплинарной компьютерной разработки. Прямо. . .
Сукцессия 19. Какие выводы я сделал из модели? Часть 2.Внутримикоризный стехиометрический буфер и хроно-дискретные зоны экспансии
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования
Сукцессия 18. Какие выводы я сделал из войны грибов с деревьями? Часть 1- рассказ и немного про термины
anaschu 11.07.2026
Био-Инженерный Ликбез: Архитектура Модели Ризосферы Математический аппарат моделирования Система ОДУ описывает динамику изменения массы различных компонентов системы во времени. Ключевой. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru