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

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

17.07.2014, 00:21. Показов 7514. Ответов 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,651
Записей в блоге: 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,651
Записей в блоге: 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,651
Записей в блоге: 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
Закрытая тема Создать тему
Новые блоги и статьи
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru