Форум программистов, компьютерный форум 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 20:25  [ТС]     Стек на шаблонах - оцените реализацию #81
Цитата Сообщение от 0x10 Посмотреть сообщение
Теперь value в Pop не используется и 100% ведет к утечкам.
тьфу забыл
C++
1
2
3
4
5
6
7
8
template <typename T>
void Stack<T>::Pop()
{
    if (!head) throw std::out_of_range("Access to element of empty container");
    NODE *tmp = head;
    head = head->prev;
    delete tmp;
}

Не по теме:

а нехило мы развернулись на 9 страниц



Добавлено через 2 минуты
з.ы. вроде теперь все ок уже? итоговая оценка =)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.07.2014, 20:57     Стек на шаблонах - оцените реализацию #82
Цитата Сообщение от GetHelp Посмотреть сообщение
C++
1
2
template <typename T>
void Stack<T>::Push(T value)
а push все так же принимает value по значениею

Цитата Сообщение от GetHelp Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
template <typename T>
T Stack<T>::Peek()
{
    if (head)
        return head->data;
    else
        throw std::out_of_range("Access to element of empty container");
}
код в стиле кодогенератора...какой может быть else после return
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 21:12  [ТС]     Стек на шаблонах - оцените реализацию #83
Цитата Сообщение от Jupiter Посмотреть сообщение
а push все так же принимает value по значениею
эмм а с этим то какие проблемы? как вы еще собираетесь добавлять элемент в стек как не через параметр функции?
Цитата Сообщение от Jupiter Посмотреть сообщение
код в стиле кодогенератора...какой может быть else после return
а какие с этим проблемы? по мне так все нормально...
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
17.07.2014, 21:16     Стек на шаблонах - оцените реализацию #84
Цитата Сообщение от GetHelp Посмотреть сообщение
эмм а с этим то какие проблемы? как вы еще собираетесь добавлять элемент в стек как не через параметр функции?
Передать по константной ссылке. Сейчас при добавлении объекта в стек происходит два копиросания. Первое - при передаче параметра, второе - парой строк ниже, при присваивании.

Цитата Сообщение от GetHelp Посмотреть сообщение
а какие с этим проблемы? по мне так все нормально...
Проблема стилистическая, противоречит логичности кода. После return последующие инструкции не будут выполняться, следовательно, else и дополнительный уровень вложенности - избыточность.

Ну и я не перевариваю объект head, у которого есть поле prev. Либо это хвост, у которого есть предыдущий элемент, либо это голова, у которой есть следующий.
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
17.07.2014, 21:16     Стек на шаблонах - оцените реализацию #85
Цитата Сообщение от GetHelp Посмотреть сообщение
как вы еще собираетесь добавлять элемент в стек как не через параметр функции?
Через параметр, только передаваемый по константной ссылке.

Цитата Сообщение от GetHelp Посмотреть сообщение
а какие с этим проблемы? по мне так все нормально...
Что изменится, если else убрать?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.07.2014, 21:18     Стек на шаблонах - оцените реализацию #86
Цитата Сообщение от GetHelp Посмотреть сообщение
эмм а с этим то какие проблемы? как вы еще собираетесь добавлять элемент в стек как не через параметр функции?
через параметр, но по ссылке на константу
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private:
    struct NODE
    {
        NODE(const T& data, NODE* prev)
        : data(data), prev(prev)
        {}
 
        T data;
        NODE *prev;
    } *head;
//...
template <typename T>
void Stack<T>::Push(const T& value)
{
    head  = new NODE(value, head);
}
Добавлено через 1 минуту
Цитата Сообщение от GetHelp Посмотреть сообщение
а какие с этим проблемы? по мне так все нормально...
а по мне те кто так пишут(я про else) просто боты
0x10
17.07.2014, 21:35
  #87

Не по теме:

Цитата Сообщение от Jupiter Посмотреть сообщение
а по мне те кто так пишут(я про else) просто боты
Туда же, видел как-то:
C++
1
2
3
4
5
6
switch (...) {
// ...
default:
  return foo;
  break;
}

GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 22:24  [ТС]     Стек на шаблонах - оцените реализацию #88
Цитата Сообщение от 0x10 Посмотреть сообщение
Передать по константной ссылке. Сейчас при добавлении объекта в стек происходит два копиросания. Первое - при передаче параметра, второе - парой строк ниже, при присваивании.
че за ссылка? не понимаю к чему усложнять... вы еще скажите что вообще передавать параметры в функциях это плохо и надо писать функции без параметров
Цитата Сообщение от 0x10 Посмотреть сообщение
Проблема стилистическая, противоречит логичности кода. После return последующие инструкции не будут выполняться, следовательно, else и дополнительный уровень вложенности - избыточность.
бред какой то вы пишите, все нормально будет выполняться... потому что просто напросто в случае когда !head код просто не пойдет по ветке с return....

Добавлено через 2 минуты
Цитата Сообщение от 0x10 Посмотреть сообщение
Ну и я не перевариваю объект head, у которого есть поле prev. Либо это хвост, у которого есть предыдущий элемент, либо это голова, у которой есть следующий.
брал за образец такой список http://learnc.info/adt/linked_list.html, там было это объявлено как next, но по сути это является не следующим, а именно предыдущим значением... меня лично это сбивало с толку
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.07.2014, 22:26     Стек на шаблонах - оцените реализацию #89
Цитата Сообщение от GetHelp Посмотреть сообщение
че за ссылка? не понимаю к чему усложнять..
или учи матчасть или иди
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
17.07.2014, 22:26     Стек на шаблонах - оцените реализацию #90
Цитата Сообщение от GetHelp Посмотреть сообщение
че за ссылка? не понимаю к чему усложнять...
Это не усложнение, а нужна оптимизация. В противном случае, при большом кол-ве данных твоя программа будет работать медленнее, чем программа с передачей параметров через ссылки.
Цитата Сообщение от GetHelp Посмотреть сообщение
вы еще скажите что вообще передавать параметры в функциях это плохо и надо писать функции без параметров
Без причины передавать, например, структуру с набором данных не по ссылке - да, плохо.
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 22:27  [ТС]     Стек на шаблонах - оцените реализацию #91
Jupiter, вообще первый раз вижу такой странный код

1. функция внутри структуры? да вы видно шутите... разве так можно?
2. что за странный синтаксис у этой функции? что за двоеточие? и почему присвоение вне фигурных скобок?
3. head = new NODE(value, head); вообще не понял как это?
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
17.07.2014, 23:03     Стек на шаблонах - оцените реализацию #92
Толсто. Больше похоже на грубость.
DrOffset
6421 / 3795 / 878
Регистрация: 30.01.2014
Сообщений: 6,584
17.07.2014, 23:45     Стек на шаблонах - оцените реализацию #93
Цитата Сообщение от GetHelp Посмотреть сообщение
функция внутри структуры? да вы видно шутите... разве так можно?
Можно. В С++ struct - это класс.
Цитата Сообщение от GetHelp Посмотреть сообщение
что за странный синтаксис у этой функции? что за двоеточие? и почему присвоение вне фигурных скобок?
Список инициализации. Любая книга по С++ в разделе "классы и ООП" даст ответ.
Цитата Сообщение от GetHelp Посмотреть сообщение
head = new NODE(value, head); вообще не понял как это?
Конструктор. Инициализация объекта в выделенной динамической памяти. Опять же, в любой книге это есть.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
18.07.2014, 04:49     Стек на шаблонах - оцените реализацию #94
Цитата Сообщение от GetHelp Посмотреть сообщение
бред какой то вы пишите, все нормально будет выполняться...
В конкретно этом случае я говорю о стиле кода, а не о последовательности выполнения операторов. Код избыточный и неестественный для чтения человеком.
Хедин
18.07.2014, 08:20
  #95

Не по теме:

Понимаю, конечно, что самоуверенность прет изо всех щелей, но обычно, если код непонятен, то лучше попросить у автора объяснение, вдруг это вы не в курсе каких то особенностей языка

GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
18.07.2014, 16:45  [ТС]     Стек на шаблонах - оцените реализацию #96
Цитата Сообщение от DrOffset Посмотреть сообщение
Можно. В С++ struct - это класс.
че реально? первый раз слышу...
Цитата Сообщение от DrOffset Посмотреть сообщение
Список инициализации. Любая книга по С++ в разделе "классы и ООП" даст ответ.
почитаю...
Цитата Сообщение от DrOffset Посмотреть сообщение
Конструктор. Инициализация объекта в выделенной динамической памяти. Опять же, в любой книге это есть.
ни разу не видел тож =(
Цитата Сообщение от 0x10 Посмотреть сообщение
В конкретно этом случае я говорю о стиле кода, а не о последовательности выполнения операторов. Код избыточный и неестественный для чтения человеком.
не знаю, а мне норм...

Добавлено через 1 минуту
еще не понятно такое объявление
Цитата Сообщение от Jupiter Посмотреть сообщение
void Stack<T>::Push(const T& value)
что значит T& value??? * - значит указатель, & - применяется для взятия адреса, как можно & юзать в параметре объявления функции?
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
18.07.2014, 16:49     Стек на шаблонах - оцените реализацию #97
GetHelp, предлагаю оставить форумитов в покое, а вместо этого взять книгу по с++ и немного самостоятельно позаниматься. Тем более впереди целые выходные.
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
18.07.2014, 16:52  [ТС]     Стек на шаблонах - оцените реализацию #98
ну и наконец я подумал и мне пофиг как на ваш взгляд красиво, а как нет, я оставлю для себя пуш с возвращаемым значением Т, разве что оставлю Т без указателя и с ошибкой при вызове с пустым стеком... всю остальную фигню ну нафиг, зачем лишние телодвижения? которые как я уже сказал почти никогда не могут пригодится... тема про то что плохо передавать в параметрах переменные звучит как полный бред, я буду делать класс так чтобы его потом было удобно использовать, а не так чтобы было все идеально правильно на ваш взгляд... как видите из скринов я попробовал класс аж на 5к значений, все работало за секунду... так что я не знаю сколько надо брать значений чтоб было реально заметное замедление работы из за каких то там хрен знает где утечек...

Добавлено через 1 минуту
Цитата Сообщение от Ilot Посмотреть сообщение
GetHelp, предлагаю оставить форумитов в покое, а вместо этого взять книгу по с++ и немного самостоятельно позаниматься. Тем более впереди целые выходные.
да у меня так и вовсе целые каникулы ок в принципе класс работает, тему можно закрыть

Добавлено через 2 минуты
Цитата Сообщение от GetHelp Посмотреть сообщение
что значит T& value??? * - значит указатель, & - применяется для взятия адреса, как можно & юзать в параметре объявления функции?
мне только вот про это интересно узнать, может я чего то не знаю еще...
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
18.07.2014, 17:01     Стек на шаблонах - оцените реализацию #99
GetHelp, Не знаете. Практически всего, что касается С++. Амперсанд (&) используется не только для взятия адреса, но так же для указания, что значение передано по ссылке (про ссылки читать в учебнике).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2014, 17:03     Стек на шаблонах - оцените реализацию
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
18.07.2014, 17:03  [ТС]     Стек на шаблонах - оцените реализацию #100
ForEveR, бррр нет уж увольте, вообще си++ не для меня, мне нравится чистый си...
Yandex
Объявления
18.07.2014, 17:03     Стек на шаблонах - оцените реализацию
Закрытая тема Создать тему
Опции темы

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