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

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

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

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

17.07.2014, 00:21. Просмотров 3535. Ответов 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
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 01:08  [ТС] #16
Цитата Сообщение от Vourhey Посмотреть сообщение
Запустится.
не запустится, выбивает ошибку "Run-Time Check Failure #3 - The variable 'r' is being used without being initialized."
Цитата Сообщение от Vourhey Посмотреть сообщение
Хах. Ну, например, на списках стек можно реализовать.
че это? о_О
Цитата Сообщение от Vourhey Посмотреть сообщение
Ага, и после n будешь пушить и опять будет грохаться, если памяти не добавишь.
да пробовал я еще изначально так, но это как то тупо и не красиво выходит, т.к. каждый раз перевыделять память на 1 элемент... как то тупо...
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.07.2014, 01:16 #17
Цитата Сообщение от GetHelp Посмотреть сообщение
не запустится, выбивает ошибку "Run-Time Check Failure #3 - The variable 'r' is being used without being initialized."
Это ты к своему компилятору обратись. Пользоваться неинициализироваными данными никто не запрещает.
Тем более, что в приведенном мной примере стоит ..., что означает "любой код". Можешь в нем писать, че хочешь. Если твоему компилятору не нравится - инициализируй. Как я уже сказал, ничего от этого не изменится - прога твоя упадет. А ты пытаешься обратить внимание на какие-то левые вещи.
Цитата Сообщение от GetHelp Посмотреть сообщение
че это? о_О
Почитай, опять же. Как и про адресную арифметику.
Цитата Сообщение от GetHelp Посмотреть сообщение
но это как то тупо и не красиво выходит
Сделай красиво, кто мешает?
Цитата Сообщение от GetHelp Посмотреть сообщение
каждый раз перевыделять память на 1 элемент.
И твое решение было - поэтому давай совсем не выделять

Добавлено через 1 минуту
Из крайности в крайность. Либо выделять под все сразу, либо не выделять вообще. Третьего не дано.
ууууффф, ты жжОшь )
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 01:21  [ТС] #18
Vourhey, ааа вот загуглил про списки, наверное это то что нужно, вот скажем первая ссылка с гугла, все довольно просто http://learnc.info/adt/linked_list.html

Добавлено через 35 секунд
утром попробую
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.07.2014, 01:29 #19
GetHelp, типа того, да, как вариант.
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 08:14  [ТС] #20
щас еще не пытался делать через списки, пришла просто в голову мысль как улучшить свой вариант

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
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 = 1;
}
 
template <typename T>
Stack<T>::~Stack()
{
    T* ptr = data;
    for(int i = 0; i < count; i++)
        delete (ptr -= size);
}
 
template <typename T>
void Stack<T>::Push(T value)
{
    data += size;
    data = new T;
    *data = value;
    count++;
}
 
template <typename T>
T Stack<T>::Pop()
{
    count--;
    T tmp = *data;
    T* ptr = data;
    data -= size;
    delete ptr;
    return tmp;
}
вот, только вылетает с ошибкой при вызове деструктора...
0
Миниатюры
Стек на шаблонах - оцените реализацию  
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
17.07.2014, 08:23 #21
Если две страницы диалога с компетентным человеком не привели вас к пониманию вашей проблемы, то тут уже очень сложно пытаться вам объяснить, что нужно либо выделять блок памяти для N-го количества элементов, либо сохранять указатели на выделенные блоки в функции Push.
3
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 08:29  [ТС] #22
Ilot, а вы вообще читали мой последний пост? я по вашему что делаю?

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

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

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

C
1
delete [] (data - size*count);
0
Хедин
74 / 69 / 36
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 08:33 #23
GetHelp, мое мнение. Сделайте на списках, либо на перевыделении памяти (сделал на 15 элементов массив, если пытаемся 16 вписать, выделяется память уже под 20 элементов). Так, имхо, будет порядочнее
0
GetHelp
-7 / 61 / 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;
}
0
Хедин
74 / 69 / 36
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 08:42 #25
GetHelp, если я правильно ваш код понял, у вас используется невыделенная память для хранения указателей. Тоже как бы не круто
0
GetHelp
-7 / 61 / 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();
}
0
Хедин
74 / 69 / 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;
}
программа падает...
0
Хедин
74 / 69 / 36
Регистрация: 17.05.2014
Сообщений: 301
17.07.2014, 08:59 #28
GetHelp, после вывода 2-3 элемента критическая ошибка, причем при втором выводе явно мусорное значение.
0
Миниатюры
Стек на шаблонах - оцените реализацию  
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 09:00  [ТС] #29
Хедин, я ухожу щас, приду посмотрю почему у вас падает... возможно из за того что не через typedef объявлена, тип не полноценный...
0
Хедин
74 / 69 / 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 элементов), половину элементов вывел, после чего опять "работа программы завершена"
0
Миниатюры
Стек на шаблонах - оцените реализацию   Стек на шаблонах - оцените реализацию  
17.07.2014, 09:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2014, 09:06
Привет! Вот еще темы с ответами:

Подстановка вычисляемого типа в шаблонах - 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; ...


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

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

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