forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Списки данных (http://forum.boolean.name/showthread.php?t=3101)

HolyDel 09.04.2007 21:49

Re: Списки данных
 
спасибо Knightmare
не, item ненадо шаблонить. это базовый класс от него будем плясать при создании элементов для списков.
а вот list надо зашоблонить чтобы можно было юзать новоиспеченные классы - потомки item'a.

alcoSHoLiK 09.04.2007 23:59

Re: Списки данных
 
При твоей структуре item шаблонить надо. Непонятно только, какие от него могут быть потомки.

HolyDel 10.04.2007 01:18

Re: Списки данных
 
Код:

// test2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream.h>


class item
{
public:
        int x;
        item* next;
        item* prev;
};

class bullet
{
public:
        float x,y,z;
        float spd;
        int l;
        bullet* next;
        bullet* prev;
};

template<typename item_>
class list
{
public:
        item_* first;
        item_* last;
//===================================================
        list(){
                first=NULL;
                last=NULL;
        }
//===================================================
        item_* append()
        {
                item_* temp;
                temp = new bullet;
                if(!first){
                        first=temp;
                        first->prev=NULL;
                        first->next=NULL;
                }else{
                        if(!last){
                                last=temp;
                                first->next=last;
                                last->prev=first;
                                last->next=NULL;
                        }else{
                                temp->next=NULL;
                                temp->prev=last;
                                last->next=temp;
                                last=temp;
                        }

                }
                return temp;
        }
//==================================================
        item_* crash(item_* el)
        {
                if((!(el->next)) && (!(el->prev)))
                {
                        first=NULL;
                        last=NULL;
                        delete el;
                        return NULL;
                }else
                {
                if(!(el->next))
                {
                        if(el->prev){
                        el->prev->next=NULL;
                        last=el->prev;}
                }else{
                        if(!(el->prev)){
                                if(el->next){
                                el->next->prev=NULL;
                                first=el->next;}
                        }else{
                                el->next->prev=el->prev;
                                el->prev->next=el->next;                               
                        }
                }
                item_* ret;
                if (el->prev){ret=el->prev;}else{ret=NULL;}
                delete el;
                return ret;       
                }
        }
};




int main(int argc, char* argv[])
{

        list<bullet> l;

l.append()->x=34;
l.append()->x=10;
l.append()->x=18;
l.append()->x=20;
l.append()->x=30;
l.append()->x=34;
l.append()->x=21;

        printf("Hello World!\n");
        for (bullet* e=l.first;e;e=e->next)
        {
                cout<<e->x<<endl;
        }


        for (e=l.first;e;e=e->next)
        {
                if((e->x)<25){e=l.crash(e);}
        }

        printf("===========================================\n");

       
        for (e=l.first;e;e=e->next)
        {
                cout<<e->x<<endl;
        }
        cout<<endl<<"enter char"<<endl;

        char h;
        cin>>h;
        return 1;
}

короче появилась идея, нафиг не шаблонить item а создаавать совершенно новый класс, прчием две строчки-
<имя класса*>prev
<имя класса*>next
все же придеться вручную набирать, не могу пока придумать как это автоматизировать.
а List зашаблонить так, чтобы в качестве типа указывать класс, (bullet) например.
пример выше.
ЗЫ. Криво работает удаление (удаление в переборе) :(

Knightmare 10.04.2007 01:23

Re: Списки данных
 
как вариант - шаблонить list и передавать туды класс любой но чтобы он имел поля next и prev =) хз бует или нет работать не пробовал такой изврат =) т.е. имеем нечто такое:
Код:

template<typename _Ty>
class List
{
  private:
      _Ty * first;
      _Ty * last;
  public:
      //методы всякие
};

в общем ка то так =) пробуй =)
З.Ы. а нафиг те вообще такой изврат? опиши ситуацию мож чо лучше придумаем =)

HolyDel 10.04.2007 01:31

Re: Списки данных
 
ситуация:
я вполне привык к билтцевским типам, ищщу альтернативу. думаю такая фигня не покатит, при инициализации экземпляра класса list будут проблемы (list<item<bla-bla-bla>> gnom). хз конечно, я серьезно c++ не так давно изучаю.

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

jimon 10.04.2007 01:36

Re: Списки данных
 
HolyDel
брр
делай связаный список с шаблоном и ложи ето отдельно

а потом юзай обычный класс пули
не вижу смысла шаблоны применять в items

HolyDel 10.04.2007 01:42

Re: Списки данных
 
я тоже не вижу :)
поэтому и не применяю ;)

Knightmare 10.04.2007 12:06

Re: Списки данных
 
гммм... и все проблемы из-за привычки? =) ну в общем то дело твое, но знание STL обычно является обязательным условием при приеме на работу =) хотя если это только типо хобби то не страшно, хотя... вообще вот это:
Код:

list<item<bla-bla-bla>> gnom
работать не станет =) а вот это:
Код:

list<item<bla-bla-bla> > gnom;
станет =) а вообще я ведь предлагал не так малость ну да ладно =)
воообще как вариант есть ведь typedef:
Код:

typedef item<bla-bla-bla> gnomeitem;
list<gmoneitem> gnome;

и вообще посмотри все таки STL'овские вектора, мапы, списки =) думаю они тебе понравится больше чем блитзевские =)
З.Ы. а чо удаление не работает?

alcoSHoLiK 10.04.2007 16:55

Re: Списки данных
 
Цитата:

Сообщение от HolyDel
ситуация:
я вполне привык к билтцевским типам, ищщу альтернативу.

Зачем тогда писать на С++, если сам себе ставить ограничения, которые были в блице? Лучше тогда ориентироваться на БМаксовский структуры, так как там ООП.
Да, в STL перебор, удаление, произвольное удаление, поиск - это все уже реализовано и проверено годами. Ты уверен, что сделаешь лучше?)

alcoSHoLiK 12.04.2007 22:46

Re: Списки данных
 
Может пригодиться:
http://www.gamedev.ru/articles/?id=70103


Часовой пояс GMT +4, время: 04:33.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot