Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.59/27: Рейтинг темы: голосов - 27, средняя оценка - 4.59
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
1

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

17.07.2014, 00:21. Показов 5634. Ответов 101
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
просто хочу узнать чужое мнение, написал стек через шаблоны, оцените реализацию
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.07.2014, 00:21
Ответы с готовыми решениями:

Сделать реализацию list (классы node и list) на шаблонах
Помогите написать прогу Необходимо: Сделать реализацию list (классы node и list) на шаблонах....

Оцените реализацию внедрения зависимостей
Собственно захотелось простенький вариант, ибо особо не нужно и не хочется тащить нормальные библы,...

Оцените реализацию Угадывателя чисел
И вопрос на засыпку, можно ли как то максимально оптимизировать данный процесс? Если да, то как....

Оцените реализацию вертикального списка
Сделал вертикальный список с навигацией по стрелкам клавиатуры. ...

101
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
17.07.2014, 20:25  [ТС] 81
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от 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
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
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
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
17.07.2014, 21:12  [ТС] 83
Цитата Сообщение от Jupiter Посмотреть сообщение
а push все так же принимает value по значениею
эмм а с этим то какие проблемы? как вы еще собираетесь добавлять элемент в стек как не через параметр функции?
Цитата Сообщение от Jupiter Посмотреть сообщение
код в стиле кодогенератора...какой может быть else после return
а какие с этим проблемы? по мне так все нормально...
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
17.07.2014, 21:16 84
Цитата Сообщение от GetHelp Посмотреть сообщение
эмм а с этим то какие проблемы? как вы еще собираетесь добавлять элемент в стек как не через параметр функции?
Передать по константной ссылке. Сейчас при добавлении объекта в стек происходит два копиросания. Первое - при передаче параметра, второе - парой строк ниже, при присваивании.

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

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

Цитата Сообщение от GetHelp Посмотреть сообщение
а какие с этим проблемы? по мне так все нормально...
Что изменится, если else убрать?
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
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
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
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
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.07.2014, 22:26 89
Цитата Сообщение от GetHelp Посмотреть сообщение
че за ссылка? не понимаю к чему усложнять..
или учи матчасть или иди
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
17.07.2014, 22:26 90
Цитата Сообщение от GetHelp Посмотреть сообщение
че за ссылка? не понимаю к чему усложнять...
Это не усложнение, а нужна оптимизация. В противном случае, при большом кол-ве данных твоя программа будет работать медленнее, чем программа с передачей параметров через ссылки.
Цитата Сообщение от GetHelp Посмотреть сообщение
вы еще скажите что вообще передавать параметры в функциях это плохо и надо писать функции без параметров
Без причины передавать, например, структуру с набором данных не по ссылке - да, плохо.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
17.07.2014, 22:27  [ТС] 91
Jupiter, вообще первый раз вижу такой странный код

1. функция внутри структуры? да вы видно шутите... разве так можно?
2. что за странный синтаксис у этой функции? что за двоеточие? и почему присвоение вне фигурных скобок?
3. head = new NODE(value, head); вообще не понял как это?
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
17.07.2014, 23:03 92
Толсто. Больше похоже на грубость.
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
17.07.2014, 23:45 93
Цитата Сообщение от GetHelp Посмотреть сообщение
функция внутри структуры? да вы видно шутите... разве так можно?
Можно. В С++ struct - это класс.
Цитата Сообщение от GetHelp Посмотреть сообщение
что за странный синтаксис у этой функции? что за двоеточие? и почему присвоение вне фигурных скобок?
Список инициализации. Любая книга по С++ в разделе "классы и ООП" даст ответ.
Цитата Сообщение от GetHelp Посмотреть сообщение
head = new NODE(value, head); вообще не понял как это?
Конструктор. Инициализация объекта в выделенной динамической памяти. Опять же, в любой книге это есть.
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
18.07.2014, 04:49 94
Цитата Сообщение от GetHelp Посмотреть сообщение
бред какой то вы пишите, все нормально будет выполняться...
В конкретно этом случае я говорю о стиле кода, а не о последовательности выполнения операторов. Код избыточный и неестественный для чтения человеком.
0
Хедин
18.07.2014, 08:20
  #95

Не по теме:

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

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

Добавлено через 1 минуту
еще не понятно такое объявление
Цитата Сообщение от Jupiter Посмотреть сообщение
void Stack<T>::Push(const T& value)
что значит T& value??? * - значит указатель, & - применяется для взятия адреса, как можно & юзать в параметре объявления функции?
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
18.07.2014, 16:49 97
GetHelp, предлагаю оставить форумитов в покое, а вместо этого взять книгу по с++ и немного самостоятельно позаниматься. Тем более впереди целые выходные.
2
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
18.07.2014, 16:52  [ТС] 98
ну и наконец я подумал и мне пофиг как на ваш взгляд красиво, а как нет, я оставлю для себя пуш с возвращаемым значением Т, разве что оставлю Т без указателя и с ошибкой при вызове с пустым стеком... всю остальную фигню ну нафиг, зачем лишние телодвижения? которые как я уже сказал почти никогда не могут пригодится... тема про то что плохо передавать в параметрах переменные звучит как полный бред, я буду делать класс так чтобы его потом было удобно использовать, а не так чтобы было все идеально правильно на ваш взгляд... как видите из скринов я попробовал класс аж на 5к значений, все работало за секунду... так что я не знаю сколько надо брать значений чтоб было реально заметное замедление работы из за каких то там хрен знает где утечек...

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

Добавлено через 2 минуты
Цитата Сообщение от GetHelp Посмотреть сообщение
что значит T& value??? * - значит указатель, & - применяется для взятия адреса, как можно & юзать в параметре объявления функции?
мне только вот про это интересно узнать, может я чего то не знаю еще...
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
18.07.2014, 17:01 99
GetHelp, Не знаете. Практически всего, что касается С++. Амперсанд (&) используется не только для взятия адреса, но так же для указания, что значение передано по ссылке (про ссылки читать в учебнике).
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
18.07.2014, 17:03  [ТС] 100
ForEveR, бррр нет уж увольте, вообще си++ не для меня, мне нравится чистый си...
0
18.07.2014, 17:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.07.2014, 17:03
Помогаю со студенческими работами здесь

Оцените реализацию классов с использованием наследования
Программируя, я никогда раньше не пользовался наследованием классов и всем, что к этому относится и...

Программа для шифрования файлов в один контейнер. Оцените реализацию
Приветствую. Написал свою первую программу. Суть такая: Выбираются файлы, добавляются в...

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

Ошыбка на шаблонах
Простая проблемка, но никак не могу понять почему оно не работет. Выдает ошибку: Notice:...


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

Или воспользуйтесь поиском по форуму:
100
Закрытая тема Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru