powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / шаблон класса
20 сообщений из 20, страница 1 из 1
шаблон класса
    #34568594
kometa_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите,пл...с созданием шаблона класса к заданию массив переменного размера на основе связанного списка непрерывных фрагментов..т.е. это образно говоря связынный список на основе массива...
...
Рейтинг: 0 / 0
шаблон класса
    #34570008
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще-то можно создать массив на основе связного списка, но наоборот - зачем??

________________________________________________________
Глюк - это высокоорганизованная система не поддающихся определению частиц
...
Рейтинг: 0 / 0
шаблон класса
    #34570046
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelikkвообще-то можно создать массив на основе связного списка, но наоборот - зачем??

________________________________________________________
Глюк - это высокоорганизованная система не поддающихся определению частиц
На связанном списке массив создать однозначно нельзя. Поскольку массив это нетолько оператор [],
Предполагает константное время доступа к произвольному элементу
...
Рейтинг: 0 / 0
шаблон класса
    #34570445
kometa_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы не правы,что нельзя создать связанный список на основе массива...вполне можно на основе динамического массива...
Но я уже поняла,что это не то,что мне надо...
По сути, мне ведь нужно описать однонаправленный(вероятно) список с динамическими массивами в качестве полей данных..причем в первой ячейке(элементе списка) содержатся элементы массива с индексами (допустим, если разбиваем по 5) 0,1,2,3,4....во второй 5,6,7,8,9 и т.д.
Я даже рисунок нарисовала...
спасибо за любое содействие...
...
Рейтинг: 0 / 0
шаблон класса
    #34570750
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А тебе это зачем? И до какой степени сложности. Ежели чтоб на STL контейнер было похоже, это возни на неделю
...
Рейтинг: 0 / 0
шаблон класса
    #34570889
kometa_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это моя лаба...во вторник надо сдать....максимум в четверг(чтобы зачет получить)...
Через stl мне это как раз-таки и не надо....а надо через struct (ну или class),т.е. эта структура должна быть описана в шаблоне..я вообще без понятия,как это все сделать...помогите кто-нибудь,pl...
...
Рейтинг: 0 / 0
шаблон класса
    #34573229
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тебе класс - реализуй
Код: plaintext
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.
template<class T>
class SermentedArray
{
public:
  SegmentedArray(int segment_size =  128 );
  SegmentedArray(int size, int segment_size =  128 );
  SegmentedArray(int size, const T&, int segment_size =  128 );
  SegmentedArray(const SegmentedArray&);
  SegmentedArray(const SegmentedArray&, int segment_size);
  ~SegmentedArray();

  SegmentedArray& operator=(const SegmentedArray&);

  T& operator[](int);
  T& at(int n);
  int size()		const;
  int capacity()	const;
  void capacity(int);

  void push_back(const T&);
  void push_front(const T&);
  void insert(int, const T&);
  void erase(int);

private:
  struct Segment
  {
    Segment* _next;
    void*    _data;
    int	     _size;
  };

  Segment* _first;
  int 	   _segment_size;
  int	   _segment_count;
};

...
Рейтинг: 0 / 0
шаблон класса
    #34573592
kometa_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ой...как-то вы загнули...я не ас в программировании...я тут кое-чего написала...но,наверное,это не правильно....может вы посмотрите....чего исправите...
Код: plaintext
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.
template <class T> class Node
{

   public:
    int ni; //кол-во эл-в я ячейке(=5)
    int nj; //кол-во ячеек
    T *mt;
    int k;
 class spisok
 {
  public:
  spisok *next;
  T *K;
  spisok(){K=new T[ 5 ];}
  ~spisok (){delete []K;}
 };
 public:
 spisok *root;
 Node(int n,int m){k= 0 ;ni=n;nj=m;mt=new T[ni*nj];root=NULL;}
 ~Node (){delete []mt;};

 //добавление
void Add( T y)
 {
   spisok *el=new spisok;
   el->next=NULL;
   spisok *cur=root;
  if (root==NULL)
   {nj++; root=el; mt[k]=y; k++;}
  else
  {while (cur->next!=NULL)
    {if ((k/ 5 )<=nj)
         {mt[k]=y;k++;}
      else {cur=cur->next;
                 cur->next=el;nj++;mt[k]=y;k++;}
     }
      }
     };
...
Рейтинг: 0 / 0
шаблон класса
    #34573668
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну мы с вами почти близнецы братья, за исключением некоторых ньюансов и имен классовваш класс Node(кстати почему Node) и есть массив, то что у меня называется SegmentedArray.
Только вот не понятно кто такой mt и какова его роль, вроде как договаривались что данные будут хранится внутри сегентов массива.
С отальными членами понятно
ni (_segment_size) - емкость одного сегмента (мах кол-во элементов)
nj (_segment_count) - количество сегментов
spisok(_first) - Указатель на 1 сегмент массива
k - непонял кто такой
класс Spisok очень похож на мой Segment. Только вот тут уже наметилась ошибка. У вас сегмент массива (элемент списка) содержит дмнамический массив T[] и инициализируете вы его как new T[5]б а это неверно. Поскольку в вашем случае у вас создаются 5 объектов типа T с помощью конструктора T(). Правильно же аллокировать сырую память (void*) размером достаточным для размещения 5 элементов массива, и только при фактическом добавлении элемента размещать его в этой области памяти оператором new(buffer) T(t) где t -адрес по которому производится размещение, а е есть const T&
Далее пошла каша...
Ну и зачем нам такой конструктор?
У меня вот ясно и понятно
Код: plaintext
1.
2.
3.
4.
5.
  SegmentedArray(int segment_size =  128 ); // создаем пустой массив с сегментом заданного размера
  SegmentedArray(int size, int segment_size =  128 ); //массив с заданным размером сегмента и заданным размером заполненный элементами созданными конструктором без переметровT()
  SegmentedArray(int size, const T&, int segment_size =  128 ); // как и предыдущий но заполнен копиями указанного значения
  SegmentedArray(const SegmentedArray&); // конструктор копирования
  SegmentedArray(const SegmentedArray&, int segment_size); // копия мессива но с другим размером сегмента
Ну а с добавлением полная пурга... Надо было сначала доползти до последнего сегмента, выяснить можно ли ему в хвост записать элемент (Segment._size < _segment_size), по разместить объект в после последнего занятого елемента в сегменте, и только ежели сегмент полон создать новый сегмент и разместить в нем.
ЗЫ Интересные у вас лабы, да и время выхода в эфир. Уж не массачусетс ли?
...
Рейтинг: 0 / 0
шаблон класса
    #34573696
kometa_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
это у вас 5 конструкторов? зачем их столько? и почему размер сегмента равен 128?!
и вот вы написали
SegmentedArray(const SegmentedArray&, int segment_size); // копия мессива но с другим размером сегмента

А зачем другой размер сегмента? он постоянен ведь должен быть для всех сегментов

прокоментируйте,пл...
SegmentedArray& operator=(const SegmentedArray&);

T& operator[](int);
T& at(int n);
int size() const;
int capacity() const;
void capacity(int);

void push_back(const T&);
void push_front(const T&);
void insert(int, const T&);
void erase(int);
ну,и если уж совсем не в лом...помогите с добавление эл-та
(я работаю с формами,просто прописать ф-ю Add(T y))
...
Рейтинг: 0 / 0
шаблон класса
    #34573706
kometa_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а еще...на счет добавления....у меня ведь сегменты создаются по мере добавления элементов....я добавляю по одному...
...
Рейтинг: 0 / 0
шаблон класса
    #34573724
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kometa_aэто у вас 5 конструкторов? зачем их столько? и почему размер сегмента равен 128?!
и вот вы написали

Это размер по-умолчанию. Можно сделать любой другой.
kometa_a
SegmentedArray(const SegmentedArray&, int segment_size); // копия мессива но с другим размером сегмента

А зачем другой размер сегмента? он постоянен ведь должен быть для всех сегментов

Конечно для одног массива он постоянен, но никто не запрещает сделать у его соседа другой.
kometa_a
прокоментируйте,пл...

SegmentedArray& operator=(const SegmentedArray&); // оператор присвоения вдруг кому захочется сказать a=b

T& operator[](int); // оператор [] собственно доступ к элементу массива по индексу
T& at(int n); // тоже самое но с проверкой выхода за границы массива прото так принято
int size() const; // размер массива, фактическое число элементов в присутствующих в массиве
int capacity() const; // емкость массива, сколько может быть расположено элементов в массиве
void capacity(int); // установка емкости массива

void push_back(const T&); // запись элемента в хвост
void push_front(const T&); // запись элемента в голову
void insert(int, const T&); // запись элемента перед элеиентом с индексом
void erase(int); .. удаление элемента с индексом
kometa_a
ну,и если уж совсем не в лом...помогите с добавление эл-та
(я работаю с формами,просто прописать ф-ю Add(T y))
завтра у меня на часах 0:10
...
Рейтинг: 0 / 0
шаблон класса
    #34574036
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну давай попробуем добавить, только структуру spisok надо будет изменить
Код: plaintext
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.
template <class T>
class Node
{
...
struct spisok // public писать не придется
{
  spisok* next;   
  void*    K;  // всетаки это должна быть неинициализированная память
  int        size; // надо ведь знать сколько элементов уже занято

  
  spisok(size_t bytes) : size( 0 ) { K = (void*) new char[bytes];}
  ~spisok ()              {delete []K;}
 };
...
};
// вообще-то добавление зависит от политики. можно добавлять в конецБ можно на первое 
// свободное место. я поступлю просто - в конец
template<class T>
void Node<T>::Add(const T& obj)
{
  spisok* target =  0 ; // сюда мы будем добалять, только вот его еще надо найти
  if (root) // у нас уже есть некоторое число сегментов
  {
    for (target = root; target->next; target = target->next) // взяли последний
      ;
    if (target->size == ni)
    {
      spisok* next = new spisok(sizeof(T) * ni);
      target->next = next;
      target = next;
    }
  }
  else
  {
    spisok* target = new spisok(sizeof(T) * ni);
    root = target;
  }
  // Теперь собственно надо сохранить копию объекта
  new (target->K + sizeof(T) * size) T(obj);
  size++;
}

...
Рейтинг: 0 / 0
шаблон класса
    #34576074
kometa_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ой,ну мы с вами прям так похожи....я тут тож кое-чего написала(пока править как у вас не стала,но очень похоже...и то,что надо)....описание шаблона я подкорректирую по вам,добавление тоже.....посмотрите,пл..доступ по индексу(я думаю,что правильно) и удаление(вот с этим проблема,я как бы написала для удаления ячейки...а надо,чтобы удалялось по элементу, для удаления,наверно поиск надо сделать или,можно ли так:в стрингриде выделяю эл-т,который хочу удалить,нажимаю кнопку...и он удаляется....просто,что бы поиск не делать...у так его индекс уже будет известен....или так нельзя?)...спасибо вам огромное...
Код: plaintext
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.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
template <class T> class MySet
{

  class Node
 {
   public:
   T *K;
   Node *next;
   Node(){ K=new T[ 5 ];}
  ~Node(){delete []K;}
  };

 public:
  Node *root;
  MySet(){root=NULL;}
 // ~MySet();



 //Добавление элемента
 void Add(T y)
 {

   Node *el=new Node;
   Node *cur=root;
   el->next=NULL;

  if (root==NULL)
   { root=el;
      }
  else
    {

     while (cur->next!=NULL)

        cur=cur->next;
        cur->next=el;
    }
};

//Удаление
 void Dell( )
 {
  Node *cur=root;
  if (root==NULL)
    return;
  else
    {
     delete cur->next;
     cur->next=NULL;
    }
  };

 //доступ по индексу
T& operator[](int i)
{ Node *cur;
 for (cur=root;int k= 0 ,k<i/ 5 ;k++)
 cur=cur->next;
 return cur->k[i% 5 ];
};
};
...
Рейтинг: 0 / 0
шаблон класса
    #34576189
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kometa_aОй,ну мы с вами прям так похожи....
Не, я мальчик
kometa_a
я тут тож кое-чего написала(пока править как у вас не стала,но очень похоже...и то,что надо)....описание шаблона я подкорректирую по вам,добавление тоже.....посмотрите,пл..доступ по индексу(я думаю,что правильно)

Как говорил один мой друг. It depends. В данном случае все будет зависеть от политики удаления.
Дело в том что удаляя элемент тебе придется следующие за ним элементы перезаписать, ведь они должны следовать в векторе последовательно один за другим, без дыр. И здесь возможны два варианта
1) мы будем подтягивать весь хвост до конца, только это долго....Зато искать потом просто
2) мы будем подтягивать хвост до конца сегмента, это займет меньше времени, однако будем приводить к фрагментации, т. е. сегмент может содержать не max число элементов
Хотя ежели построить алгоритм правильно это различие невелируется
У вас там все равно цикл криво написан
for (cur=root;int k=0,k<i/5;k++)
Поэтому моя версия
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
T& opreator[](int i)
{
  Node* curr;
  for ( curr  = root; curr && i > curr->size; curr = curr->next)
    i -= curr->size;
  if (!curr) // выход за границуБ что делать не знаю
    throw  1 ;
  return (reinterpret_cast<T*>(curr->K))[i];
}

kometa_a
и удаление(вот с этим проблема,я как бы написала для удаления ячейки...а надо,чтобы удалялось по элементу, для удаления,наверно поиск надо сделать или,можно ли так:в стрингриде выделяю эл-т,который хочу удалить,нажимаю кнопку...и он удаляется....просто,что бы поиск не делать...у так его индекс уже будет известен....или так нельзя?)...

Ты вообще-то непонятно что удалаяешь с точки зрения пользователя, а по правде ты зачем-то снесла 2 сегмент, а остальные дали утечку памяти...
С удалением это сложно...
kometa_a
спасибо вам огромное...

Пошел ужинать, ща на хлеб намажу
...
Рейтинг: 0 / 0
шаблон класса
    #34579198
kometa_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я переделала эту прогу совсем по новому....все работает нормально...при добавлении....удаляет тоже правильно,но до определенного момента....вылетает ошибка и выделяется строчка проги из ф-и удаления (я ее подчеркнула)...может вы найдете ошибку...потому что я прям не знаю в чем дело....

Код: plaintext
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.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
template<class T>
class MyListFragment       // все для одного фрагмента
{
private:
    T* m_data;  //выделяем память   под фрагмент
    int m_length;  //кол-во эл-в в
    int m_count;   //счетик(сколько добавили)

public:
    MyListFragment* Next;
/**********************************************************************************/
    MyListFragment(int capacity)   //конструктор
    {
        m_data = new T[capacity];
        m_length = capacity;
        m_count =  0 ;
        Next = NULL;
    }
/*********************************************************************************/
    ~MyListFragment()                //дестуктор
    {
        if (Next != NULL)
        {
            delete Next;
        }
        delete [] m_data;
    }
/*********************************************************************************/
    void Add(T value)
    {
        if (!IsFull())
        {
            m_data[m_count] = value;
            ++m_count;
        }
    }
 /*******************************************************************************/
  T Remove(int index)
    {
        if (index >=  0  && index < m_count)
        {
            int result = m_data[index];
            for (int i = index; i < m_count -  1 ; ++i)
            {
                m_data = m_data[i +  1 ];
            }
            --m_count;
            return result;
        }
    }
/********************************************************************************/
    T Get(int index)
    {
        if (index >=  0  && index < m_count)
        {
            return m_data[index];
        }
     }
/********************************************************************************/
    bool IsFull()
    {
        return m_length == m_count;
    }
/********************************************************************************/
    int Count()
    {
        return m_count;
    }
/********************************************************************************/
    int Capacity()    //размер фрагмента
    {
        return m_length;
    }
/********************************************************************************/
};
/********************************************************************************/
template<class T>
class MyList
{
private:
    MyListFragment<T>* m_firstFragment;
    const static int m_fragmentsCapacity =  5 ;
public:
/*******************************************************************************/
    MyList()                          //конструктор
    {
        m_firstFragment = NULL;
    }
/********************************************************************************/
     ~MyList()                             //деструктор
    {
        if (m_firstFragment != NULL)
        {
            delete m_firstFragment;
        }
    }
/********************************************************************************/
    int Get (int index)                        //доступ по индексу
    {
        if (index >=  0  && index < Count())
        {
            MyListFragment<T>* fragment = m_firstFragment;
            int i =  0 ;
            while (fragment != NULL)
            {
                if (index < i + fragment->Capacity()) //i+длина фрагмента
                {
                    return fragment->Get(index - i);
                }
                i += fragment->Count();
                fragment = fragment->Next;
            }
        }
     }
/************************************************************************************************/
  void Remove(T value)
    {
        MyListFragment<T>* fragment = m_firstFragment;
        while (fragment != NULL)
        {
            for (int j =  0 ; j < fragment->Count(); j++)
            {
                if (fragment->Get(j) == value)
                {
                    fragment->Remove(j);
                    while (fragment != NULL && fragment->Next != NULL && fragment->Next->Count() >  0 )
                    {
                        int removed = fragment->Next->Remove( 0 );
                        fragment->Add(removed);
                        if (fragment->Next->Count() ==  0 )
                        {
                            delete fragment->Next; 
                            fragment->Next = NULL;
                        }
                        fragment = fragment->Next;
                    }
                    break;
                }
            }
           [i] fragment = fragment->Next;        }
    }
/**************************************************************************************/
   void Add(T value)
    {
        if (m_firstFragment == NULL)
        {
            m_firstFragment = new MyListFragment<T>(m_fragmentsCapacity);
        }

        MyListFragment<T>* fragment = m_firstFragment;
        while (true)
        {
            if (fragment->IsFull())
            {
                if (fragment->Next == NULL)
                {
                    fragment->Next = new MyListFragment<T>(m_fragmentsCapacity);
                }
                fragment = fragment->Next;
            }
            else
            {
                fragment->Add(value);
                break;
            }
        }
    }
/************************************************************************************/
    int Count()   //считает кол-во эл-в массива
    {
        int result =  0 ;
        MyListFragment<T>* fragment = m_firstFragment;
        while (fragment != NULL)
        {
            result += fragment->Count();
            fragment = fragment->Next;
        }
        return result;
    }
/***********************************************************************************/
};

#endif
...
Рейтинг: 0 / 0
шаблон класса
    #34579200
kometa_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чего-то она не выделилась
из ф-и
void Remove(T value)
{
MyListFragment<T>* fragment = m_firstFragment;
while (fragment != NULL)
{
for (int j = 0; j < fragment->Count(); j++)
{
if (fragment->Get(j) == value)
{
fragment->Remove(j);
while (fragment != NULL && fragment->Next != NULL && fragment->Next->Count() > 0)
{
int removed = fragment->Next->Remove(0);
fragment->Add(removed);
if (fragment->Next->Count() == 0)
{
delete fragment->Next;
fragment->Next = NULL;
}
fragment = fragment->Next;
}
break;
}
}
fragment = fragment->Next;
}
}

Последняя строчка fragment = fragment->Next;
...
Рейтинг: 0 / 0
шаблон класса
    #34579266
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Содрала, я даже знаю где. Может конечно препод и примет, только вот чушь там написана полнейшая
...
Рейтинг: 0 / 0
шаблон класса
    #34681710
Elizabeth Talor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LgJn9e A number of universities have awarded her honorary degrees, and she earned a prestigious job on the staff of Detroit congressman John Conyers. In 1988 Roxanne Brown noted: "Thirty-two years after she attracted international attention for sparking the Montgomery Bus Boycott, Mrs. Parks's ardent devotion to human rights still burns brightly, like a well-tended torch that ignites her spirit and calls her to service whenever she is needed."
...
Рейтинг: 0 / 0
шаблон класса
    #34691458
mrbus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Список, содержащий динамические массивы:
list<vector<MyType>>
Дальше думайте сами :)
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / шаблон класса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]