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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.88
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 00:21     Стек на шаблонах - оцените реализацию #1
просто хочу узнать чужое мнение, написал стек через шаблоны, оцените реализацию
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 (т.е. предыдущий и следующий элементы) потом забил, толку с них никакого, все равно по смещению ищу значение
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2014, 00:21     Стек на шаблонах - оцените реализацию
Посмотрите здесь:

Вопрос по исключениям в шаблонах классов C++
C++ Программа добавляет введенный массив 5*5 в стек и выводит полученный стек двумя столбцами
C++ пытаюсь сделать реализацию через считывание из файла кол-ва чисел, i,но незнаю как сделать реализацию из файла в массив и сортировки.
Доступ к элементам tuple в шаблонах C++
Тип, зависимый от условия в шаблонах C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
17.07.2014, 08:23     Стек на шаблонах - оцените реализацию #21
Если две страницы диалога с компетентным человеком не привели вас к пониманию вашей проблемы, то тут уже очень сложно пытаться вам объяснить, что нужно либо выделять блок памяти для N-го количества элементов, либо сохранять указатели на выделенные блоки в функции Push.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 08:29  [ТС]     Стек на шаблонах - оцените реализацию #22
Ilot, а вы вообще читали мой последний пост? я по вашему что делаю?

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

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

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

C
1
delete [] (data - size*count);
Хедин
 Аватар для Хедин
73 / 68 / 36
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 08:33     Стек на шаблонах - оцените реализацию #23
GetHelp, мое мнение. Сделайте на списках, либо на перевыделении памяти (сделал на 15 элементов массив, если пытаемся 16 вписать, выделяется память уже под 20 элементов). Так, имхо, будет порядочнее
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 08:36  [ТС]     Стек на шаблонах - оцените реализацию #24
Цитата Сообщение от Хедин Посмотреть сообщение
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;
}
Хедин
 Аватар для Хедин
73 / 68 / 36
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 08:42     Стек на шаблонах - оцените реализацию #25
GetHelp, если я правильно ваш код понял, у вас используется невыделенная память для хранения указателей. Тоже как бы не круто
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 08:44  [ТС]     Стек на шаблонах - оцените реализацию #26
Цитата Сообщение от Хедин Посмотреть сообщение
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();
}
Хедин
 Аватар для Хедин
73 / 68 / 36
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 08:51     Стек на шаблонах - оцените реализацию #27
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;
}
программа падает...
Хедин
 Аватар для Хедин
73 / 68 / 36
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 08:59     Стек на шаблонах - оцените реализацию #28
GetHelp, после вывода 2-3 элемента критическая ошибка, причем при втором выводе явно мусорное значение.
Миниатюры
Стек на шаблонах - оцените реализацию  
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 09:00  [ТС]     Стек на шаблонах - оцените реализацию #29
Хедин, я ухожу щас, приду посмотрю почему у вас падает... возможно из за того что не через typedef объявлена, тип не полноценный...
Хедин
 Аватар для Хедин
73 / 68 / 36
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 09:06     Стек на шаблонах - оцените реализацию #30
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 элементов), половину элементов вывел, после чего опять "работа программы завершена"
Миниатюры
Стек на шаблонах - оцените реализацию   Стек на шаблонах - оцените реализацию  
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
17.07.2014, 09:18     Стек на шаблонах - оцените реализацию #31
Цитата Сообщение от 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;
}
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.07.2014, 10:29     Стек на шаблонах - оцените реализацию #32
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 минуту
на посмотри как люди пишут Списки, стеки, очереди
Хедин
 Аватар для Хедин
73 / 68 / 36
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 11:12     Стек на шаблонах - оцените реализацию #33
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; }
};
Хотя вот не уверен, нужно ли дополнительно занулять указатели, сейчас попробую без них. И без обнуления работает
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 11:27  [ТС]     Стек на шаблонах - оцените реализацию #34
Хедин, у меня все работает...
Миниатюры
Стек на шаблонах - оцените реализацию   Стек на шаблонах - оцените реализацию   Стек на шаблонах - оцените реализацию  

Стек на шаблонах - оцените реализацию  
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 11:30  [ТС]     Стек на шаблонах - оцените реализацию #35
Цитата Сообщение от Ilot Посмотреть сообщение
По-моему, что то не то раз ваша программа падает
моя программа не падает
Цитата Сообщение от Ilot Посмотреть сообщение
ибо не факт, что выделенные блоки памяти расположенны последовательно.
факт...
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
17.07.2014, 11:38     Стек на шаблонах - оцените реализацию #36
Цитата Сообщение от GetHelp Посмотреть сообщение
факт...
Факт когда у вас мир в радужных тонах, а вот если вы попытаетесь применить свой стек в реальной программе вас ждет много сюрпризов и часы проведенные в обнимке с отладчиком.
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 11:41  [ТС]     Стек на шаблонах - оцените реализацию #37
Цитата Сообщение от Ilot Посмотреть сообщение
Факт когда у вас мир в радужных тонах, а вот если вы попытаетесь применить свой стек в реальной программе вас ждет много сюрпризов и часы проведенные в обнимке с отладчиком.
вы видите скрины... несколько разных примеров с разными типами, не представляю что вам тут еще доказывать... все работает без проблем...

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

C++
1
2
3
4
5
6
template <typename T>
Stack<T>::~Stack()
{
    if (count > 0)
        delete [] (data - size * count);
}
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
17.07.2014, 11:48     Стек на шаблонах - оцените реализацию #38
Цитата Сообщение от 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();
}
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
17.07.2014, 11:56     Стек на шаблонах - оцените реализацию #39
Зачем спраживать чужое мнение если не планируешь к нему прислушиваться?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2014, 12:01     Стек на шаблонах - оцените реализацию
Еще ссылки по теме:

C++ Подстановка вычисляемого типа в шаблонах
Переменные в стеке. Где хранятся? Как обрабатываются? Есть ли программный стек или только стек процессора? C++
C++ Класс на шаблонах, менять аргументы шаблона

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

Или воспользуйтесь поиском по форуму:
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
17.07.2014, 12:01     Стек на шаблонах - оцените реализацию #40
Цитата Сообщение от GetHelp Посмотреть сообщение
все работает без проблем...
Угу. для разнообразия - в моем примере массив заполни перед первым Pop, раз уж по коду не понятно.
Yandex
Объявления
17.07.2014, 12:01     Стек на шаблонах - оцените реализацию
Закрытая тема Создать тему
Опции темы

Текущее время: 01:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru