Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Dal moze i kako: Unique Associative Container al po clanovima elemenata

[es] :: C/C++ programiranje :: Dal moze i kako: Unique Associative Container al po clanovima elemenata

[ Pregleda: 2158 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

DDMM
Dejan D. M. Milosavljevic
Danguba
Gajba, ali ne piva.

Član broj: 2544
Poruke: 89
62.108.111.*

Sajt: www.ddmrm.com


Profil

icon Dal moze i kako: Unique Associative Container al po clanovima elemenata23.12.2003. u 15:09 - pre 247 meseci
Znaci imam kontejner koji je minimum UAC i poredjenje se vrsi po nekom od clanova elemenata.

Npr.
Code:

 // paznja: pseudo kod
 class A
  {
   public:
    A(){}

    string M_name;
    int M_data;
  };

 UAC_member<A,A::M_name> c; // ne mora bas ovakva sintaksa;
 A a; 
  a.M_name = "prvi";
  a.M_data  = 12;


 c.insert( a );

 cout << c["prvi"].M_data << endl; // operator[] nije obavezan.



U gornjem primeru M_name je kljuc i on je clan od A. E to je bitno.


Jes jednom key_type je deo data_type, a data_type je ustvari value_type.


X
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Dal moze i kako: Unique Associative Container al po clanovima elemenata23.12.2003. u 20:14 - pre 247 meseci
Malo je nejasno. Ako hoćeš da je ključ M_name, a vrednost M_data, šta će ti onda asocijativni kontejner? Overloaduješ operator < za klasu A da poredi M_name i onda koristiš std::set<A>.

Ili sam pogrešno razumeo šta želiš?
 
Odgovor na temu

DDMM
Dejan D. M. Milosavljevic
Danguba
Gajba, ali ne piva.

Član broj: 2544
Poruke: 89
62.108.111.*

Sajt: www.ddmrm.com


Profil

icon Re: Dal moze i kako: Unique Associative Container al po clanovima elemenata25.12.2003. u 10:26 - pre 247 meseci
To sa set mi je 100* padalo napamet i da tako uradim nije problem.
Napravim svoj _Compare funktor i gotovo, ALI...
set neupotrebljiv jer ne mogu da menjam elemente set kontejnera.
Posebno ono M_data.
Kao sto navedoh u primeru M_name kljuc M_data podatak i sve je u jednoj klasi.
Tako MORA je moze mi se desiti situacija da izvedem nesto iz te klase ... pa pametni pointeri i sl.
Znaci nesto set-oliko al' da mogu da menjam elemente,
pozivam non-const f-je uz eventualno ogranicenja da je M_name const sto je i razumljivo.

X
 
Odgovor na temu

sspasic
Sasa Spasic

Član broj: 3261
Poruke: 175
*.medianis.net

Jabber: sspasic@elitesecurity.org
ICQ: 35454521


Profil

icon Re: Dal moze i kako: Unique Associative Container al po clanovima elemenata25.12.2003. u 14:59 - pre 247 meseci
A zasto ti ne odgovara std::map?
 
Odgovor na temu

DDMM
Dejan D. M. Milosavljevic
Danguba
Gajba, ali ne piva.

Član broj: 2544
Poruke: 89
62.108.111.*

Sajt: www.ddmrm.com


Profil

icon Re: Dal moze i kako: Unique Associative Container al po clanovima elemenata25.12.2003. u 16:40 - pre 247 meseci
Citat:
sspasic:
A zasto ti ne odgovara std::map?


Kako?
map<A::M_name,A> bas i nece.
A da map-iram na pointer clana klase imacu side efekat(ako uspem).
Mislim da je key_type pointer na clana klase.

Ovde je value_type pair<...>.
A iz njega nija bas prijatno izvoditi.

Padalo mi je i ovo napamet al nisam probao:
Code:

 class A
  {
   public
   string M_name;
   mutable int M_data;
  };

 std::set<A> a;


Ako radi ne bih jer ne volim mutante. A i nije bas u duhu OOP-a.
[offtopic]Kav bi to show bio kad bih stavio da je i M_name mutable.






X
 
Odgovor na temu

sspasic
Sasa Spasic

Član broj: 3261
Poruke: 175
*.medianis.net

Jabber: sspasic@elitesecurity.org
ICQ: 35454521


Profil

icon Re: Dal moze i kako: Unique Associative Container al po clanovima elemenata25.12.2003. u 17:16 - pre 247 meseci
Code:

std::map<sts::string, A *> mapa;

...
A * a = ...
mapa[a->M_name] = a;

Samo treba voditi racuna o oslobadjanju memorije koje zauzimaju vrednosti.
 
Odgovor na temu

DDMM
Dejan D. M. Milosavljevic
Danguba
Gajba, ali ne piva.

Član broj: 2544
Poruke: 89
62.108.111.*

Sajt: www.ddmrm.com


Profil

icon Re: Dal moze i kako: Unique Associative Container al po clanovima elemenata26.12.2003. u 13:34 - pre 247 meseci
Citat:
sspasic:
Code:

std::map<sts::string, A *> mapa;

...
A * a = ...
mapa[a->M_name] = a;

Samo treba voditi racuna o oslobadjanju memorije koje zauzimaju vrednosti.


Za sad to koristim.
Mada tu se javlja problem dupliranja podataka. M_name je na dva mesta.
A sta ako promenim M_name u a?

Probao sam i ovo.
Code:

#include <iostream>
#include <iomanip>
#include <map>
#include <string>
#include <memory>

using namespace std;

class MyPtr
 {
  public:
   MyPtr(){}
   MyPtr( string* P_clan  ):M_clan( P_clan ){ }
  
   string *M_clan;
 
 };

class A
 {
  public:
  A(){}
  A( int P_data):M_data(P_data){}
  int M_data;
  string M_name;
 };
 
class MyCompare
 {
  public:
   bool operator()( MyPtr const & L, MyPtr const& D )const
    {
     return (*(L.M_clan)) < (*(D.M_clan));
    }
 
 };

#define Print\
  for(i=niz.begin(); i!=niz.end(); i++ )\
   {\
    cout << i->first.M_clan << "  " << i->second->M_name << " " << i->second->M_data << ";" << endl;\
   }

 
int main( int argc, char *argv[] )
 {
  typedef map< MyPtr, A*, MyCompare > T_niz;
  T_niz niz;
  
  A a(1),b(123),c(456);
  a.M_name = "aaa";
  b.M_name = "bbb" ;
  c.M_name = "ccc" ;
  
  niz[ MyPtr( &(a.M_name) ) ] = &a;
  niz[ MyPtr( &(b.M_name) ) ] = &b;
  niz[ MyPtr( &(c.M_name) ) ] = &c;
  
  T_niz::iterator i;
  Print

  b.M_name = "ddd" ; // Prvi Napad.
  Print

  b.M_name = "aaa" ; // I map vise nije map.
  Print

  cin.get();
  return 0;
 }



Imam utisak da to ne moze a da se ispostuju svi zahtevi za OOP-om.
Jedino se mogu osloniti na (samo)disciplinu programera. :(

X
 
Odgovor na temu

sspasic
Sasa Spasic

Član broj: 3261
Poruke: 175
*.medianis.net

Jabber: sspasic@elitesecurity.org
ICQ: 35454521


Profil

icon Re: Dal moze i kako: Unique Associative Container al po clanovima elemenata26.12.2003. u 17:17 - pre 247 meseci
Citat:
DDMM:
Mada tu se javlja problem dupliranja podataka. M_name je na dva mesta.

Ako mislis na to da je zauzece memorije ovde duplirano - to ne mora obavezno da bude tako. Implementaciji std::string je ostavljeno da li ce a=b kompletno da duplira string ili ce uvecati broj referenci (posto je kopija identicna originalu).

Citat:

A sta ako promenim M_name u a?

Ovde si u pravu.
Generalno, imas cetiri resenja:
1. disciplina ;)
2. Ako M_name sluzi samo kao kluc za mapu onda ne mora da bude deo A. Onda si problem resio.
3. Mala wrapper klasa koja ce ispravno obradjivati promenu M_name a interno koristiti std::map ili std::set
4. Od nule napravljen kontejner sa ovim osobinama. Pitanje je kada ti se ovo isplati. Mislim da, ako samo zels da sto vise ispostujes OOP, i 3. vrsi posao.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Dal moze i kako: Unique Associative Container al po clanovima elemenata

[ Pregleda: 2158 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.