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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.88
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
#1

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

17.07.2014, 00:21. Просмотров 3505. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2014, 00:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Стек на шаблонах - оцените реализацию (C++):

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

ошибка в шаблонах функций - C++
Есть у меня программа из нескольких файлов . с шаблонами для функций ... компилятор выдает следующий ошибку -&gt; &quot;/main.cpp:17: undefined...

Дружественные функции в шаблонах - C++
Как использовать дружественные функции в шаблонах? ( C++ Builder)

Typename в шаблонах класса - C++
В таком шаблоне: template &lt;typename T, int n, bool islong=???&gt; class CounterA{... требуется распознать тип, то есть переменная islong...

Вопрос по исключениям в шаблонах классов - C++
Кто подскажет как реализовать исключения в следующей задаче: Создать шаблонный класс, в котором создать одномерный массив и найти...

Доступ к элементам tuple в шаблонах - C++
Собственно, не могу понять как работать с элементами кортежа в цикле, не получается получить к ним доступ. Подскажите, кто знает, как это...

101
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,117
Записей в блоге: 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;
}
0
Jupiter
Каратель
Эксперт С++
6558 / 3979 / 227
Регистрация: 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 минуту
на посмотри как люди пишут Списки, стеки, очереди
0
Хедин
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; }
};
Хотя вот не уверен, нужно ли дополнительно занулять указатели, сейчас попробую без них. И без обнуления работает
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 11:27  [ТС] #34
Хедин, у меня все работает...
0
Миниатюры
Стек на шаблонах - оцените реализацию   Стек на шаблонах - оцените реализацию   Стек на шаблонах - оцените реализацию  

Стек на шаблонах - оцените реализацию  
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 11:30  [ТС] #35
Цитата Сообщение от Ilot Посмотреть сообщение
По-моему, что то не то раз ваша программа падает
моя программа не падает
Цитата Сообщение от Ilot Посмотреть сообщение
ибо не факт, что выделенные блоки памяти расположенны последовательно.
факт...
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,117
Записей в блоге: 5
Завершенные тесты: 1
17.07.2014, 11:38 #36
Цитата Сообщение от GetHelp Посмотреть сообщение
факт...
Факт когда у вас мир в радужных тонах, а вот если вы попытаетесь применить свой стек в реальной программе вас ждет много сюрпризов и часы проведенные в обнимке с отладчиком.
0
GetHelp
-7 / 61 / 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);
}
0
uglyPinokkio
326 / 229 / 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();
}
0
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
17.07.2014, 11:56 #39
Зачем спраживать чужое мнение если не планируешь к нему прислушиваться?
5
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
17.07.2014, 12:01 #40
Цитата Сообщение от GetHelp Посмотреть сообщение
все работает без проблем...
Угу. для разнообразия - в моем примере массив заполни перед первым Pop, раз уж по коду не понятно.
0
Хедин
73 / 68 / 36
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 12:20 #41
GetHelp, код ваш покажите. Посмотрел код на вашем примере и, по моему, понимаю, почему у вас не крашится. В стеке у вас всегда находится не больше 1 элемента, попробуйте туда записать сразу несколько чисел (штук 10), а потом уже извлекать
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 12:32  [ТС] #42
uglyPinokkio, не понял че там за тема с массивом? чем его заполнять и зачем?
Цитата Сообщение от castaway Посмотреть сообщение
Зачем спраживать чужое мнение если не планируешь к нему прислушиваться?
ну почему же, как видите изначально у меня был совсем другой код... я просто никому не верю на слово и мне нужны очень веские доводы чтобы поменять мое мнение, меня можно переспорить только доводами такой я человек

Добавлено через 49 секунд
Хедин, а вот и первый стоящий довод... действительно не юзал это так, сейчас попробовал и ошибка, был не прав буду думать...
0
Хедин
73 / 68 / 36
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 12:32 #43
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
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 12:33  [ТС] #44
а собственно интересует меня следующее: что конкретно делает функция new? это же ведь только обертка под malloc вроде? а что делает malloc? меня просто интересует можно ли как то выделить память в заданном месте памяти (т.е. рядом с предыдущими членами стека)?

Добавлено через 20 секунд
Хедин, да да я так уже попробовал и все ясно...
0
Хедин
73 / 68 / 36
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 12:36 #45
GetHelp, она выделяет участок памяти в куче, подходящего размера. А у вас получается странная штука... выделили память в куче, сместились в этой же куче на позицию (и хрен знает, что там было уже записано), перезаписали новый адрес в эту позицию, снова куда то улетели по выделенному адресу (а может и в тот же самый участок памяти попали)
0
17.07.2014, 12:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2014, 12:36
Привет! Вот еще темы с ответами:

Подстановка вычисляемого типа в шаблонах - C++
Товарищи. Помогите разобраться с шаблонами. С шаблонами начал разбираться вчера, и потому излагаю задачу полностью, дабы не быть...

Тип, зависимый от условия в шаблонах - C++
Возможно ли реализовать подобное: template &lt;uint8_t bits&gt; class test { // если bits &lt;= 8 typedef uint8_t storageType; //...

Используя стек, описать функцию проверяющую, является ли стек пустым - C++
Используя стек, описать функцию проверяющую, является ли стек пустым

Программа добавляет введенный массив 5*5 в стек и выводит полученный стек двумя столбцами - C++
Программа добавляет введенный массив 5*5 в стек и выводит полученный стек двумя столбцами #include &lt;iostream&gt; #include &lt;stdlib.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
45
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru