Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.88
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
#1

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

17.07.2014, 00:21. Просмотров 3639. Ответов 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,но незнаю как сделать реализацию из файла в массив и сортировки.
В файле input.txt находится неизвестное количество вещественных чисел в...

Typename в шаблонах класса
В таком шаблоне: template &lt;typename T, int n, bool islong=???&gt; class...

ошибка в шаблонах функций
Есть у меня программа из нескольких файлов . с шаблонами для функций ......

Assert и запятые в шаблонах
Как запихать в assert шаблон с двумя аргументами? Чего-то не компилируется....

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

101
GetHelp
60 / 61 / 11
Регистрация: 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 страниц :D



Добавлено через 2 минуты
з.ы. вроде теперь все ок уже? итоговая оценка =)
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 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
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 21:12  [ТС] #83
Цитата Сообщение от Jupiter Посмотреть сообщение
а push все так же принимает value по значениею
эмм а с этим то какие проблемы? как вы еще собираетесь добавлять элемент в стек как не через параметр функции?
Цитата Сообщение от Jupiter Посмотреть сообщение
код в стиле кодогенератора...какой может быть else после return
а какие с этим проблемы? по мне так все нормально...
0
0x10
2554 / 1734 / 285
Регистрация: 24.11.2012
Сообщений: 4,361
17.07.2014, 21:16 #84
Цитата Сообщение от GetHelp Посмотреть сообщение
эмм а с этим то какие проблемы? как вы еще собираетесь добавлять элемент в стек как не через параметр функции?
Передать по константной ссылке. Сейчас при добавлении объекта в стек происходит два копиросания. Первое - при передаче параметра, второе - парой строк ниже, при присваивании.

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

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

Цитата Сообщение от GetHelp Посмотреть сообщение
а какие с этим проблемы? по мне так все нормально...
Что изменится, если else убрать?
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 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) просто боты
1
0x10
17.07.2014, 21:35
  #87

Не по теме:

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

0
GetHelp
60 / 61 / 11
Регистрация: 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, но по сути это является не следующим, а именно предыдущим значением... меня лично это сбивало с толку
0
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.07.2014, 22:26 #89
Цитата Сообщение от GetHelp Посмотреть сообщение
че за ссылка? не понимаю к чему усложнять..
или учи матчасть или иди
0
Vourhey
Почетный модератор
6490 / 2264 / 187
Регистрация: 29.07.2006
Сообщений: 12,534
17.07.2014, 22:26 #90
Цитата Сообщение от GetHelp Посмотреть сообщение
че за ссылка? не понимаю к чему усложнять...
Это не усложнение, а нужна оптимизация. В противном случае, при большом кол-ве данных твоя программа будет работать медленнее, чем программа с передачей параметров через ссылки.
Цитата Сообщение от GetHelp Посмотреть сообщение
вы еще скажите что вообще передавать параметры в функциях это плохо и надо писать функции без параметров
Без причины передавать, например, структуру с набором данных не по ссылке - да, плохо.
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
17.07.2014, 22:27  [ТС] #91
Jupiter, вообще первый раз вижу такой странный код

1. функция внутри структуры? да вы видно шутите... разве так можно?
2. что за странный синтаксис у этой функции? что за двоеточие? и почему присвоение вне фигурных скобок?
3. head = new NODE(value, head); вообще не понял как это?
0
stima
495 / 345 / 93
Регистрация: 22.03.2011
Сообщений: 1,107
Завершенные тесты: 2
17.07.2014, 23:03 #92
Толсто. Больше похоже на грубость.
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
17.07.2014, 23:45 #93
Цитата Сообщение от GetHelp Посмотреть сообщение
функция внутри структуры? да вы видно шутите... разве так можно?
Можно. В С++ struct - это класс.
Цитата Сообщение от GetHelp Посмотреть сообщение
что за странный синтаксис у этой функции? что за двоеточие? и почему присвоение вне фигурных скобок?
Список инициализации. Любая книга по С++ в разделе "классы и ООП" даст ответ.
Цитата Сообщение от GetHelp Посмотреть сообщение
head = new NODE(value, head); вообще не понял как это?
Конструктор. Инициализация объекта в выделенной динамической памяти. Опять же, в любой книге это есть.
0
0x10
2554 / 1734 / 285
Регистрация: 24.11.2012
Сообщений: 4,361
18.07.2014, 04:49 #94
Цитата Сообщение от GetHelp Посмотреть сообщение
бред какой то вы пишите, все нормально будет выполняться...
В конкретно этом случае я говорю о стиле кода, а не о последовательности выполнения операторов. Код избыточный и неестественный для чтения человеком.
0
Хедин
18.07.2014, 08:20
  #95

Не по теме:

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

0
GetHelp
60 / 61 / 11
Регистрация: 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??? * - значит указатель, & - применяется для взятия адреса, как можно & юзать в параметре объявления функции?
0
Ilot
Эксперт С++
1826 / 1184 / 342
Регистрация: 16.05.2013
Сообщений: 3,119
Записей в блоге: 5
Завершенные тесты: 1
18.07.2014, 16:49 #97
GetHelp, предлагаю оставить форумитов в покое, а вместо этого взять книгу по с++ и немного самостоятельно позаниматься. Тем более впереди целые выходные.
2
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
18.07.2014, 16:52  [ТС] #98
ну и наконец я подумал и мне пофиг как на ваш взгляд красиво, а как нет, я оставлю для себя пуш с возвращаемым значением Т, разве что оставлю Т без указателя и с ошибкой при вызове с пустым стеком... всю остальную фигню ну нафиг, зачем лишние телодвижения? которые как я уже сказал почти никогда не могут пригодится... тема про то что плохо передавать в параметрах переменные звучит как полный бред, я буду делать класс так чтобы его потом было удобно использовать, а не так чтобы было все идеально правильно на ваш взгляд... как видите из скринов я попробовал класс аж на 5к значений, все работало за секунду... так что я не знаю сколько надо брать значений чтоб было реально заметное замедление работы из за каких то там хрен знает где утечек...

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

Добавлено через 2 минуты
Цитата Сообщение от GetHelp Посмотреть сообщение
что значит T& value??? * - значит указатель, & - применяется для взятия адреса, как можно & юзать в параметре объявления функции?
мне только вот про это интересно узнать, может я чего то не знаю еще...
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
18.07.2014, 17:01 #99
GetHelp, Не знаете. Практически всего, что касается С++. Амперсанд (&) используется не только для взятия адреса, но так же для указания, что значение передано по ссылке (про ссылки читать в учебнике).
0
GetHelp
60 / 61 / 11
Регистрация: 27.02.2013
Сообщений: 1,112
18.07.2014, 17:03  [ТС] #100
ForEveR, бррр нет уж увольте, вообще си++ не для меня, мне нравится чистый си...
0
18.07.2014, 17:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2014, 17:03
Привет! Вот еще темы с решениями:

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

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

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

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


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

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

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