[C++] Zoeken op waarde van member variabele

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Topicstarter
Hallo,

soms heb ik het gevoel dat ik de enige ben met een probleem, dus leg ik het hier maar even voor.

Het komt in mijn sw (heel) vaak voor dat er moet worden gezocht op een struct/klasse met een bepaalde waarde.

Bijvoorbeeld:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
typedef struct Node{
 QString name;
 int id;
 char value;
}

QList <Node> nodeCollection;

int searchForNode(QString name)
{
 for(int i = 0; i < nodeCollection.size(); i++)
 {
   if(nodeCollection.at(i).name == name; 
      return i;
 } 
 return -1; 
}


Nu wordt ik er een beetje moe van om voor elke struct/klasse elke keer voor alle member variabele die als 'key' dienen weer een search loopje te gaan schrijven. Dat moet slimmer kunnen.

Hoe lossen jullie dit op?

Zelf had ik het volgende in gedachte, maar dit verdiend niet de schoonheidsprijs......

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template<class ClType, class MType>
int findIndexWhere(QList<ClType> container, MType value,MType *addrOfMember, ClType * addrOfClass)
{
  if(addrOfMember > addrOfClass)           
    return -1;

  int relAddr = addrOfMember - addrOfClass;

  for(int i = 0 ; i < container.size();i++)
  {
    void * classBaseAddr = &(container.at(i));
    MType member = *((MType *) (classBaseAddr + relAddr));

    if(member == value)
      return i;
  }
}

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Mijn C kennis is ontiegelijk roestig, maar je zou toch ook een functie mee kunnen geven? Dan hoef je alleen een comperator mee te geven.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:28
En dan kun je ook wel std::find() gebruiken om te zoeken (al zou je nog steeds een wrapper kunnen schrijven als je zo'n functie vaak wil gebruiken). Nadeel blijft dat er geen eenvoudige manier is om z'n comperator ad-hoc te definiëren. Het zal ofwel een struct, ofwel een functie moeten worden, die je beide globaal moet declareren.

Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Déjà vu naar dit (recente) topic: \[C++] Object in lijst vinden mbv. member functies

Daar staan ook een aantal oplossingen in :)

Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Topicstarter
Het maken van een comperator functie voor elke member lijkt me nou niet veel werk besparen eerlijk gezegd..

Bedankt voor dat topic, niet gezien tijdens zoeken.
Zitten leuke oplossingen tussen, in ieder geval wat mooier dan die van mij denk ik.
Helaas nog niet zo recht toe recht aan als het mijn insziens zou moeten kunnen, maar ja, een mens moet wat te wensen over houden ;)

Suggesties nog altijd welkom natuurlijk.

[ Voor 15% gewijzigd door EddoH op 19-07-2010 14:47 ]