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

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

17.07.2014, 00:21. Показов 7825. Ответов 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
Закрытая тема Создать тему
Новые блоги и статьи
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru