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

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

17.07.2014, 00:21. Показов 8513. Ответов 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
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2226 / 1428 / 420
Регистрация: 16.05.2013
Сообщений: 3,655
Записей в блоге: 6
17.07.2014, 08:23
Студворк — интернет-сервис помощи студентам
Если две страницы диалога с компетентным человеком не привели вас к пониманию вашей проблемы, то тут уже очень сложно пытаться вам объяснить, что нужно либо выделять блок памяти для N-го количества элементов, либо сохранять указатели на выделенные блоки в функции Push.
3
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
17.07.2014, 08:29  [ТС]
Ilot, а вы вообще читали мой последний пост? я по вашему что делаю?

Добавлено через 2 минуты
я выделяю память поэлементно и инкрементирую счетчик выделенных элементов, после чего удаляю элементы исходя из смещения и счетчика (для деструктора)

Добавлено через 1 минуту
может конечно можно как то удалять весь массив без цикла... щас подумаю

Добавлено через 48 секунд
например так

C
1
delete [] (data - size*count);
0
 Аватар для Хедин
76 / 71 / 55
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 08:33
GetHelp, мое мнение. Сделайте на списках, либо на перевыделении памяти (сделал на 15 элементов массив, если пытаемся 16 вписать, выделяется память уже под 20 элементов). Так, имхо, будет порядочнее
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
17.07.2014, 08:36  [ТС]
Цитата Сообщение от Хедин Посмотреть сообщение
GetHelp, мое мнение. Сделайте на списках, либо перевыделении памяти (сделал на 15 элементов массив, если пытаемся 16 вписать, выделяется память уже под 20 элементов)
списки я потом отдельно посмотрю, а выделять буферами я вообще не люблю, очень не красиво смотрится имхо... а чем плох мой способ? я не вижу в нем ошибок с точки зрения логики... та ошибка правда так и выскакивает, но это что то где то мне кажется просто на 1 элемент больше удалить пытается или что то в этом роде, надо просто найти где налажал...

Добавлено через 1 минуту
так и есть, поставил изначально count = 0 и стало все норм

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
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 = 0;
}
 
template <typename T>
Stack<T>::~Stack()
{
    delete [] (data - size * count);
}
 
template <typename T>
void Stack<T>::Push(T value)
{
    count++;
    data += size;
    data = new T;
    *data = value;
}
 
template <typename T>
T Stack<T>::Pop()
{
    count--;
    T tmp = *data;
    if (count > 0)
    {
        T* ptr = data;
        data -= size;
        delete ptr;
    }
    return tmp;
}
0
 Аватар для Хедин
76 / 71 / 55
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 08:42
GetHelp, если я правильно ваш код понял, у вас используется невыделенная память для хранения указателей. Тоже как бы не круто
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
17.07.2014, 08:44  [ТС]
Цитата Сообщение от Хедин Посмотреть сообщение
GetHelp, если я правильно ваш код понял, у вас используется невыделенная память для хранения указателей. Тоже как бы не круто
значит вы не правильно поняли мой код я вообще не храню указатели, я нахожу их каждый раз по смещению относительно последнего элемента (равному размеру типа), вся память выделенная, уже все проверил
C++
1
2
3
4
5
6
7
8
9
10
11
12
void main()
{
    Stack<POINT> stack;
    for(int i = 0; i < 5000; i++)
    {
        POINT pt = {i+10,i-5};
        stack.Push(pt);
        pt = stack.Pop();
        printf("%d %d\n", pt.x, pt.y);
    }
    getch();
}
0
 Аватар для Хедин
76 / 71 / 55
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 08:51
GetHelp, а у меня в таком коде
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct vect
{
    int x, y, z;
};
 
int main()
{
    Stack <vect> arr;
    int x = 5, y = 6, z = 9;
    for (int i = 0; i < 500; i++)
    {
        vect tmp = {x++, y--, z+=2};
        arr.Push(tmp);
    }
    return 0;
}
программа падает...
0
 Аватар для Хедин
76 / 71 / 55
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 08:59
GetHelp, после вывода 2-3 элемента критическая ошибка, причем при втором выводе явно мусорное значение.
Миниатюры
Стек на шаблонах - оцените реализацию  
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
17.07.2014, 09:00  [ТС]
Хедин, я ухожу щас, приду посмотрю почему у вас падает... возможно из за того что не через typedef объявлена, тип не полноценный...
0
 Аватар для Хедин
76 / 71 / 55
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 09:06
GetHelp, не волнуйтесь, с типом double точно так же падает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
    Stack <double> arr;
    //int x = 5, y = 6, z = 9;
    for (int i = 0; i < 200; i++)
    {
        arr.Push(i*3.4);
    }
    for (int i = 0; i < 200; i++)
    {
        cout << i << ". value = " << arr.Pop() << endl;
    }
 
    return 0;
}
с типом int не вылетает, но значения хранит явно левые. Попробовал сделать стек поменьше (на 10 элементов), половину элементов вывел, после чего опять "работа программы завершена"
Миниатюры
Стек на шаблонах - оцените реализацию   Стек на шаблонах - оцените реализацию  
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2226 / 1428 / 420
Регистрация: 16.05.2013
Сообщений: 3,655
Записей в блоге: 6
17.07.2014, 09:18
Цитата Сообщение от GetHelp Посмотреть сообщение
я по вашему что делаю?
По-моему, что то не то раз ваша программа падает. Так делать нельзя:
Кликните здесь для просмотра всего текста
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
template <typename T>
Stack<T>::~Stack()
{
    delete [] (data - size * count);
}
 
template <typename T>
void Stack<T>::Push(T value)
{
    count++;
    data += size;
    data = new T;
    *data = value;
}
 
template <typename T>
T Stack<T>::Pop()
{
    count--;
    T tmp = *data;
    if (count > 0)
    {
        T* ptr = data;
        data -= size;
        delete ptr;
    }
    return tmp;
}

ибо не факт, что выделенные блоки памяти расположенны последовательно.
Вот вам простой пример с массивом (в плане безопастности этот пример не выдержит критики):
Кликните здесь для просмотра всего текста
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
template <typename T, size_t N>
class Stack
{
private:
    size_t size;
    T* data;
public:
    Stack();
    ~Stack();
    void Push(const T& value);
    T Pop();
};
 
template <typename T, size_t N>
Stack<T,N>::Stack(): data(new T[N]), size(0)
{}
 
template <typename T, size_t N>
Stack<T,N>::~Stack()
{
    delete [] data;
}
 
template <typename T, size_t N>
void Stack<T,N>::Push(const T& value)
{
    if(size < N)
        data[size++] = value;
}
 
template <typename T, size_t N>
T Stack<T,N>::Pop()
{
    T tmp = 0;
    if(size > 0)
        tmp = data[--size];
    return tmp;
}
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.07.2014, 10:29
GetHelp, ты снова сделал какашку
Цитата Сообщение от GetHelp Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
template <typename T>
void Stack<T>::Push(T value)
{
   count++; //ты ещё не добавил новый элемент, а счетчик уже увеличил
   data += size; //это строка вообще бред, сразу видно что про арифметику указателей ты так и не прочитал
   data = new T; //взял затер предыдущее значение data, вывод: предыдущая строчка нафиг не нужна, как и поле size
  *data = value;
}
смотреть дальше нет смысла
Добавлено через 1 минуту
на посмотри как люди пишут Списки, стеки, очереди
0
 Аватар для Хедин
76 / 71 / 55
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 11:12
GetHelp, лучше, имхо, вот так
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
template <class T>
class MyStack
{
public:
    MyStack<T>() : pointer(NULL) {}
    ~MyStack() { if (pointer) { while (pointer->prev) pointer = pointer->prev; clear(pointer); } }
    bool push(T val)
    {
        node *nw = new node(val);
        if (!pointer) pointer = nw;
        else
        {
            pointer->next = nw;
            nw->prev = pointer;
            pointer = nw;
        }
        return true;
    }
    bool pop(T &val)
    {
        if (!pointer) return false;
        if (!pointer->prev)
        {
            val = pointer->value;
            delete pointer;
            pointer = NULL;
        }
        else
        {
            val = pointer->value;
            pointer = pointer->prev;
            delete pointer->next;
            pointer->next = NULL;
        }
        return true;
    }
 
private:
    struct node
    {
        node(T val) : value(val), prev(NULL), next(NULL) {}
        T value;
        node *prev;
        node *next;
    };
    node *pointer;
    void clear(node *tmp) { if (tmp->next) clear(tmp->next); delete tmp; }
};
Хотя вот не уверен, нужно ли дополнительно занулять указатели, сейчас попробую без них. И без обнуления работает
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
17.07.2014, 11:27  [ТС]
Хедин, у меня все работает...
Миниатюры
Стек на шаблонах - оцените реализацию   Стек на шаблонах - оцените реализацию   Стек на шаблонах - оцените реализацию  

Стек на шаблонах - оцените реализацию  
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
17.07.2014, 11:30  [ТС]
Цитата Сообщение от Ilot Посмотреть сообщение
По-моему, что то не то раз ваша программа падает
моя программа не падает
Цитата Сообщение от Ilot Посмотреть сообщение
ибо не факт, что выделенные блоки памяти расположенны последовательно.
факт...
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2226 / 1428 / 420
Регистрация: 16.05.2013
Сообщений: 3,655
Записей в блоге: 6
17.07.2014, 11:38
Цитата Сообщение от GetHelp Посмотреть сообщение
факт...
Факт когда у вас мир в радужных тонах, а вот если вы попытаетесь применить свой стек в реальной программе вас ждет много сюрпризов и часы проведенные в обнимке с отладчиком.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
17.07.2014, 11:41  [ТС]
Цитата Сообщение от Ilot Посмотреть сообщение
Факт когда у вас мир в радужных тонах, а вот если вы попытаетесь применить свой стек в реальной программе вас ждет много сюрпризов и часы проведенные в обнимке с отладчиком.
вы видите скрины... несколько разных примеров с разными типами, не представляю что вам тут еще доказывать... все работает без проблем...

Добавлено через 1 минуту
единственное еще подправил деструктор

C++
1
2
3
4
5
6
template <typename T>
Stack<T>::~Stack()
{
    if (count > 0)
        delete [] (data - size * count);
}
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
17.07.2014, 11:48
Цитата Сообщение от GetHelp Посмотреть сообщение
моя программа не падает
Просто так звезды сложились в конкретный текущий момент времени.

Цитата Сообщение от GetHelp Посмотреть сообщение
факт...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void main()
{
    Stack<POINT> stack;
    for(int i = 0; i < 5000; i++)
    {
        POINT pt = {i+10,i-5};
        stack.Push(pt);
        char* foo_arr= new char[1024];
        POINT pt_1 = {i+20,i-10};
        stack.Push(pt_1);
        POINT rpt_1 = stack.Pop();
        printf("%d %d\n", rpt_1.x, rpt_1.y);
        POINT rpt = stack.Pop();
        printf("%d %d\n", rpt.x, rpt.y);
        delete []foo_arr;
    }
    getch();
}
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
17.07.2014, 11:56
Зачем спраживать чужое мнение если не планируешь к нему прислушиваться?
5
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
17.07.2014, 12:01
Цитата Сообщение от GetHelp Посмотреть сообщение
все работает без проблем...
Угу. для разнообразия - в моем примере массив заполни перед первым Pop, раз уж по коду не понятно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.07.2014, 12:01

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Закрытая тема Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru