Czym zastapic tablice asocjacyjna w C++

0

Witam,

przenoszę pewien program z PHP do c++. zasadniczo chodzi o operacje na tablicy wielowymiarowej.
Z tego co wiem w c++ nie ma czegos takiego jak tablice wielowymiarowe. a jeszcze gorzej ze potrzebuje w takiej tablicy (pojedytnczym rekordzie) umiescic dane roznych typow. jak wiadomo php w ogole nie robi z czyms takim problemow. dziala jak trzeba nawet jak w tej samej tablicy trzyma sie w roznych polach rozne typy.

w c++ musze zastosowac cos na kształt obiektow, struktur, ktore jak sądze bede musial umiescic w tablicy i dopiero na nich operowac.

drugim klopotem jest to, ze nie wiem oczywiscie ile bedzie rekordów, bo dane są zasysane dynamicznie.

przeczytalem pare artow na temat struktur, list, wektorow i myslę sobie ze chyba najoptymalniej bedzie zastosowac wlasnie liste struktur, albo tablice struktur.

w skrocie o co chodzi: mam w zwyklej tablicy numery produktow i potrzebuje teraz zrobic cos jak tablice hash z nazwami produkow i w ogole danymi o nich. cos co w PHP wygladaloby tak

$produky = array('2334','254','789'); // produkty do wyswietlenia

$opisy_produktow[2334]['nazwa'] = 'piec kaflowy';
$opisy_produktow[254]['nazwa'] = 'wanna';
$opisy_produktow[789]['nazwa'] = 'rower wodny';
...
// nie wiadomo ile bedzie tych elementow podczas kompilacji

//oczywiscie ma tam byc wiecej danych, ale chodzi o sam index po ktorym bedzue mozna znalezc opis produktu

//czyli przykladowo


foreach($produkty as $key => $value)
            {
           echo "produkt o numerze $key to ".$opisy_produktow[$key]['nazwa']   ;
            }

mam nadzieje ze jasno opisalem o co chodzi. chcialbym po prostu zrobic proste w php zastąpienie identyfikatora jakiegos elementu jego opisem znajdujacym sie w drugiej, wielowymiarowej tablicy.

jest ktoś z Was w stanie pomoc lub udzielic jakichs wskazowek?
Pozdrawiam
Adam

0

Jeśli dobrze rozumiem:

//dane o produkcie trzymasz np w strukturze / klasie:

class K_PROD{
 public:
    unsigned int uiID;   // ID produktu
    char ctName [100]; // nazwa
    char ctDesc [300];  // opis
};

// Twoja dynamiczna tablica produktow to np

std::vector<K_PROD *> vcrProducts;

// dodawanie nowego produktu
bool Prod_Add(K_PROD * xkpProd){

    try{

        vcrProducts.push_back(xkpProd);

    }catch(std::bad_alloc&){
        return false; // brak pamieci
    }
    return true;
}

// wyswietlenie nazw
std::vector<K_PROD *>::iterator itHlp;
for(itHlp = vcrProducts.begin(); itHlp != vcrProducts.end(); itHlp++){

    ShowMessage((*itHlp)->ctName); // nazwa
    ShowMessage((*itHlp)->ctDesc); // opis
    //...
}

0

map'a będzie bardziej odpowiednia:

struct produkt_opis
{
	string	nazwa;
	string	opis;
};

typedef map<int,produkt_opis> id_prod_map;

id_prod_map opisy_produktow;


...


id_prod_map::iterator it = opisy_produktow.find(key);
if(it != opisy_produktow.end())
{
	cout << key << ": " << it->second.nazwa << " - " << it->second.opis << '\n';
}

/* lub */

produkt_opis& opis = opisy_produktow[key];
cout << key<< ": " << opis.nazwa << " - " << opis.opis << '\n';

Opcja druga może jest wygodniejsza w zapisie, ale niezbyt praktyczna, jeśli istnieje możliwość wyszukiwania produktów spoza zbioru.

0

Cześć koledzy -=mAkAbrAs=-, 0x666 i dzięki wielkie za kod oraz pare słów komentarza.
Kilka lat klepania w php rozpieszcza jednak. ciężko chwilami wrocic do c++, zwlaszcza jak sie go uczylo po lebkach.

oba wasze rozwiązania zaraz przetestuje. powiem jeszcze, ze tablica z opisami produktów będzie mniej więcej wielkości 5000-8000 rekordów (odświeżana co parę minut), a tablica z kolejnością wyświetlania tych produktów [tablica z identyfikatorami] będzie mieć coś koło max 200 jednorazowo i być odświeżana co kilka sekund, efekt wywalany na ekran... mam nadzieje ze funkcja find tej mapy da rade.

w kazdym razie wole to podstawianie zrobić w pamięci ram niż zarzynać za kazdym razem bazę danych, bo serwer z baza danych ma poza tym jeszcze całą mase pracy.

to taka mała aplikacja sieciowa, z podglądem online co się dzieje. póki co działa ale bez opisów produktów wiec podstawowej roli nie spełnia... czyli "costam się pokazuje" ;)

pozdrawiam i dziekuje raz jeszcze
Adam

0

Już nic :D

cała noc siedzenia i czytania opisow i manuali i dało rade skompilowac...

0x666 -> Twój kod działa, nie chcialo sie skompilowac bo deklaracja struktury z opisami musi byc przed pętlą głowna programu, tzn zmienne nielokalne... dobrze rozumiem?

aha. jedna sprawa. jak wypelnic tą mapę (raczej ta całą konstrukcję ze strukturą)? tzn znalazlem cos takiego na necie :

	opisy_produktow.insert(pair<int, produkt_opis>(12313, i tu nie wiem juz co wpisac ...  ));

nada sie ten sposob na cos? jak wypelnic tą strukturę "w locie" i polaczyc ją z numerem id w mapie?

anyway, dzieki wielkie. pozdrawiam
Adam

0

deklaracja struktury z opisami musi byc przed pętlą głowna programu, tzn zmienne nielokalne... dobrze rozumiem?

Dobrze.

i tu nie wiem juz co wpisac ...

Dodaj konstruktory do produkt_opis:

produkt_opis(){}
produkt_opis(const string &n,const string &o)
	:nazwa(n),opis(o)
{}

Wtedy możesz tak:

opisy_produktow.insert(id_prod_map::value_type(666,produkt_opis("nazwa","opis")));

lub prościej:

opisy_produktow[666] = produkt_opis("nazwa","opis");
0

witam ponownie,

moja struktura wyglada tak:

struct produkt_opis
{
      string nazwa;
      string opis;
      produkt_opis(const string &n,const string &o)
        :nazwa(n),opis(o){}
} ;

mam nadzieje ze dobrze rozumiem Twój zapis (sprawdzilem w manualu do c i chyba dobrze).

pierwszy sposob dodawania rekordow do mapy (bo chyba mozna tak to nazwac)
działa dobrze :

opisy_produktow.insert(id_prod_map::value_type(666,produkt_opis("nazwa","opis")));

na drugim przewraca się kompilator
i rzyga takim czyms

[C++ Error] _map.h(162): E2285 Could not find a match for 'produkt_opis::produkt_opis()'
[C++ Error] _map.h(162): E2285 Could not find a match for 'pair<const int,produkt_opis>::pair(const int,undefined)'
[C++ Error] _map.h(162): E2285 Could not find a match for 'map<int,produkt_opis,less<int>,allocator<pair<const int,produkt_opis> > >::insert(_Rb_tree_iterator<pair<const int,produkt_opis>,_Nonconst_traits<pair<const int,produkt_opis> > >,undefined)'

ogolnie nie ma juz stresu, bo zasade dzialania znam i dzialajacy kod tez juz jest, ale chcialbym zrozumiec co i jak.
pozdrawiam
Adam

0

[C++ Error] _map.h(162): E2285 Could not find a match for 'produkt_opis::produkt_opis()'

Brakuje domyślnego konstruktora. Dziwne, bo podałem go razem z tym dwuparametrowym, przyjrzyj się :|

0

ok, faktycznie, przeoczylem. wygląda na to że działa :)
thx
Adam

1 użytkowników online, w tym zalogowanych: 0, gości: 1