ФлеймФорумПрограммирование

Создан стек

Страницы: 1 2 311 12 Следующая »
#0
19:32, 5 апр 2010

Тренирую С++.
Сделал стек. Нужна конструктивная критика.

/*----------------------------------------------------------------------------*/
/*                                 6y6yka Engine                              */
/*----------------------------------------------------------------------------*/
#ifndef _B_STACK_H_
#define _B_STACK_H_
/*----------------------------------------------------------------------------*/
#include <cstring>
#include <cassert>
/*----------------------------------------------------------------------------*/
/* класс bStack                                                               */
/* описание:                                                                  */
/*     реализация структуры типа стек                                         */
/* методы:                                                                    */
/*     Push    помещает данные в стек                                         */
/*     Pop     извлекает данные из стека                                      */
/*     Leangth возвращает количество элементов                                */
/*     Size    возвращает объем занимаемой памяти                             */
/*     Resize  изменяет объем занимаемой памяти                               */
/*----------------------------------------------------------------------------*/
template <typename bStackType>
class bStack
{
private:
  bStackType *data;
  int         leangth;
  int         alloced;
  static const int default_size = 1;     // начальное количество элементов

  bStack(const bStack &);                // запрещаем копирование
  bStack &operator =(const bStack &);
public:
  bStack();
  ~bStack();

  void        Push(const bStackType &item);
  bStackType &Pop();

  int         Leangth() const;
  int         Size()    const;
  int         Resize(const int new_size);
};
/*----------------------------------------------------------------------------*/
/* bStack<bStackType>::bStack                                                 */
/*----------------------------------------------------------------------------*/
template <typename bStackType>
inline bStack<bStackType>::bStack()
{
  data = 0;
  leangth = alloced = 0;
}
/*----------------------------------------------------------------------------*/
/* bStack<bStackType>::~bStack                                                 */
/*----------------------------------------------------------------------------*/
template <typename bStackType>
inline bStack<bStackType>::~bStack()
{
  delete[] data;
}
/*----------------------------------------------------------------------------*/
/* bStack<bStackType>::Push                                                   */
/* описание:                                                                  */
/*     помещает новый элемент в стек                                          */
/* аргументы:                                                                 */
/*     item    ссылка на новый элемент                                        */
/*----------------------------------------------------------------------------*/
template <typename bStackType>
inline void bStack<bStackType>::Push(const bStackType &item)
{
  if(!(alloced - leangth))
    if(data)
      Resize(alloced * 2);
    else
      data = new bStackType[alloced = default_size];
  
  data[leangth++] = item;
}
/*----------------------------------------------------------------------------*/
/* bStack<bStackType>::Pop                                                    */
/* описание:                                                                  */
/*     извлекает элемент с верхушки стека                                     */
/* возвращает:                                                                */
/*     ссылку на извлеченный элемент                                          */
/*----------------------------------------------------------------------------*/
template <typename bStackType>
inline bStackType &bStack<bStackType>::Pop()
{
  assert(leangth);           // нельзя лазать ниже дна
  return data[--leangth];
}
/*----------------------------------------------------------------------------*/
/* bStack<bStackType>::Leangth                                                */
/* описание:                                                                  */
/*     возвращает количество элементов в стеке                                */
/*----------------------------------------------------------------------------*/
template <typename bStackType>
inline int bStack<bStackType>::Leangth() const
{
  return leangth;
}
/*----------------------------------------------------------------------------*/
/* bStack<bStackType>::Size                                                   */
/* описание:                                                                  */
/*     возвращает максимальное количество элементов                           */
/*----------------------------------------------------------------------------*/
template <typename bStackType>
inline int bStack<bStackType>::Size() const
{
  return alloced;
}
/*----------------------------------------------------------------------------*/
/* bStack<bStackType>::Resize                                                 */
/* описание:                                                                  */
/*     увеличивает максимально количества элементов                           */
/* аргументы:                                                                 */
/*     new_size    новый размер в итемах. не должен быть меньше старого       */
/* возвращает:                                                                */
/*     новый размер                                                           */
/*----------------------------------------------------------------------------*/
template <typename bStackType>
inline int bStack<bStackType>::Resize(const int new_size)
{
  if(new_size < alloced) // запрет урезания памяти
    return alloced;

  if(data)
  {
    bStackType *new_data = new bStackType[new_size];
    memcpy(new_data, data, leangth * sizeof(bStackType));
    delete[] data;
    data = new_data;
  }
  else
    data = new bStackType[new_size];

  return alloced = new_size;
}
/*----------------------------------------------------------------------------*/
#endif /* _B_STACK_H_ */
#1
19:37, 5 апр 2010

это не стек, это какой-то ущербный std::vector

> leangth = alloced = 0;
lurn grumma

>увеличивает максимально колличество элементов
"колличество" пишется через "а"

>Тренирую С++.
вижу, он уже вот-вот начнёт слушаться

[/остроумие]

#2
19:40, 5 апр 2010

leangth без a, alloced - allocated

#3
19:48, 5 апр 2010

Pokimon
> memcpy(new_data, data, leangth * sizeof(bStackType));
эта строчка неверна. Подумай почему и напиши правильно

#4
19:51, 5 апр 2010

AndryBlack
> > memcpy(new_data, data, leangth * sizeof(bStackType));
> эта строчка неверна. Подумай почему и напиши правильно
Копируем в новую память из старой памяти только нужные байты. В чем мой промах?

Gordon
> leangth без a, alloced - allocated
Проверил. вы правы. Поправлю в версии 1.1

Suslik
> это не стек
Чем это оно не стек?
По моему и спереди и с сзади стек, как стек.

#5
20:00, 5 апр 2010

Pokimon
> В чем мой промах?
плохо, садись три
пошли наводящие вопросы:
Что будет складываться в этот контейнер?

#6
20:02, 5 апр 2010

AndryBlack
> Что будет складываться в этот контейнер?
Как и в любой контейнер. Все что угодно.
Будут и обычные типы и классы.
У некоторых классов может быть оператор =
Чтобы его не тревожить и нужен memcpy

#7
20:05, 5 апр 2010

Pokimon
> Чтобы его не тревожить и нужен memcpy
садись два.
пример copyable класса при работе с которым твой "стэк" всё поламает сам придумаешь?

#8
20:10, 5 апр 2010

AndryBlack
> copyable
Если верить гуглу, то это слово - бессмыслица.

Я так понял вы имеете в виду классы, которые нельзя копировать?
Они и так не попадут в стек. У меня же еще в Push - data[leangth++] = item;
А которые можно копировать уже скопированы и следовательно memcpy не повредит.
Да и работает он не в пример быстрее всяких операторов.
Или я не прав?

#9
20:12, 5 апр 2010

Pokimon
> > copyable
> Если верить гуглу, то это слово - бессмыслица.
может со словом и наврал,  английский неочень
> Я так понял вы имеете в виду классы, которые нельзя копировать?
наоборот

#10
20:13, 5 апр 2010

Pokimon
> У некоторых классов может быть оператор =
> Чтобы его не тревожить и нужен memcpy

Если "=" делали, значит это кому нибудь нужно?
Вот напишешь ты свои строки в подобном же стиле. Запихнешь в них указатель char *data и в деструкторе строк будет delete[] data; Прогони теперь такую строку через твой Resize() и осознай.

#11
20:15, 5 апр 2010

Ну напишите пример класса, который нельзя засунуть в этот стек и вытянуть живым умники?
А так каждый может болтать.

=A=L=X=
> Если "=" делали, значит это кому нибудь нужно?
Это нужно для более удобочитаемой записи. Не более.

#12
20:17, 5 апр 2010

Pokimon
> у напишите пример класса, который нельзя засунуть в этот стек и вытянуть живым
> умники?
std::string , std::vector< some_type >, std::list< another_type > ...
еще ?

#13
20:19, 5 апр 2010

AndryBlack
> std::string , std::vector< some_type >, std::list< another_type > ...
> еще ?
ушел тестить

правка:
std::string прошел через 2 memcpy и уцелел.

#14
20:28, 5 апр 2010
class bString {
  private:
    char* m_data;
    size_t m_length;
  public:
    bString() : m_data(0),m_length(0) {}
    bString(const char* str) {
       m_length = ::strlen(str);
       m_data = new char [ m_length ];
       ::memcpy(m_data,str,m_length);  
    }
    bString(const bString& str) ....
    ~bString() { delete [] m_data;}
    
    bString& operator = (const bString& str) {
       if (&str==this) return *this;
       delete [] m_data;
       m_length = str.m_length;
       m_data = new char [ m_length ];
       ::memcpy(m_data,str.m_data,m_length);
       return *this;
    }
};
Страницы: 1 2 311 12 Следующая »
ФлеймФорумПрограммирование

Тема в архиве.