title: Verzameling (informatica)
text: Een verzameling (Engels: set) is een datacontainer die geïnspireerd is op een verzameling zoals de wiskunde die kent.
  
  Een verzameling bestaat uit een hoeveelheid unieke leden (eng: members). Algemener (voor alle containers) heten de leden ook wel elementen of items.
  
  Een verzameling lijkt op een bag, maar in een bag hoeven de elementen niet uniek te zijn.
  
  Uitleg 
  Er zijn formeel twee volkomen verschillende soorten verzamelingen. Een bitarray en een container. Een bitarray wordt toegepast als de mogelijke waarden van tevoren bekend zijn en dit aantal waarden niet al te groot wordt. De container-vorm kan gebruikt worden voor een verzameling van objecten, en heet ook wel een collection.
  
  De manier waarop de taal Pascal een SET implementeert is een voorbeeld van een bitarray.
  
  Een verzameling zoals de wiskunde die definieert is ongeordend, maar de implementatie binnen programmeertalen heeft door de aard van computers altijd een interne ordening. Meestal is dit in de programmeursinterface terug te vinden doordat er een manier bestaat om de leden van de verzameling op te sommen.
  
  Operaties 
  Een verzameling in een programmeertaal kent diverse operaties. De declaraties van deze functies zijn (in pseudocode):
   Verzameling.Bevat(ElementType): BOOLEAN		// test op lidmaatschap van element
   Verzameling.Bevat(Verzameling): BOOLEAN		// test of het argument omsloten wordt
   Verzameling.operator+(ElementType): Verzameling	// geeft de verzameling plus het element
   Verzameling.operator+(Verzameling): Verzameling	// geeft de vereniging van twee verzamelingen
   Verzameling.operator-(ElementType): Verzameling	// geeft de verzameling minus het element
   Verzameling.operator-(Verzameling): Verzameling	// geeft de doorsnede van twee verzamelingen
   Verzameling.operator=(ElementType)		// toewijzing, maakt de verzameling leeg behalve één element
   Verzameling.operator=(Verzameling)		// toewijzing, kopieert de verzameling
   Verzameling.VoegToe(ElementType)		// Plus-operatie met toewijzing 
   Verzameling.VoegToe(Verzameling)		// Plus-operatie met toewijzing
   Verzameling.Verwijder(ElementType)		// Min-operatie met toewijzing
   Verzameling.Verwijder(Verzameling)		// Min-operatie met toewijzing
  
  Daarnaast is er vaak een manier om de leden van de verzameling op te sommen, al dan niet met behulp van een iterator.
  
  Ook aan de objecten die in een verzameling opgenomen kunnen worden, worden minimale eisen gesteld. Om te beginnen moeten ze een methode definiëren om te bepalen of twee objecten gelijk zijn. In Java is de equals() methode hiervoor voor de hand liggende keuze. In C++ zou je hiervoor operator==() kunnen kiezen. Dit is theoretisch voldoende om een object in een verzameling op te kunnen nemen, maar om een en ander efficiënt te kunnen implementeren moeten deze objecten minstens ook een hash() methode bevatten óf een methode die een ordening aangeeft tussen twee objecten.
  
  Voorbeelden van gebruik 
  Het gebruik van een bitarray zou er zo uit kunnen zien:
   // voorbeeld 1, verzameling gebaseerd op een bitarray
   ENUM kleur (groen, blauw, geel)
   FUNCTION meng(mengsel: BITARRAY<kleur>): kleur
      IF mengsel.Bevat(geel) AND mengsel.Bevat(blauw) THEN
         RETURN groen
      ENDIF
   ENDFUN
   
   VARIABELE verfmengsel= NEW BITARRAY<kleur>
   verfmengsel= blauw
   verfmengsel.VoegToe(geel)
   PRINT meng(verfmengsel)
  
  Het gebruik van een verzameling die gebaseerd is op een container zou er zo uit kunnen zien. Om het voorbeeld kort te houden is wederom gekozen voor niet OO-code en als lid van de verzameling is om dezelfde reden het type string gekozen.
   // voorbeeld 2, verzameling gebaseerd op een container
   FUNCTION meng(mengsel: OBJECTVERZAMELING<string>): string
      IF mengsel.Bevat("blauw") AND mengsel.Bevat("geel") THEN
         RETURN "groen"
      ENDIF
   ENDFUN
   
   VARIABELE verfmengsel= NEW OBJECTVERZAMELING<string>
   verfmengsel= "blauw"
   verfmengsel.VoegToe("geel")
   PRINT meng(verfmengsel)
  
  Eigenlijk is het tweede voorbeeld bijna gelijk aan het eerste behalve dat het type 'kleur' vervangen is door het type 'string'. Dit is echter wel een essentieel verschil omdat aan de laatste verzameling elke denkbare string toegevoegd zou kunnen worden, terwijl de eerste slechts met de gedefinieerde kleuren kan werken. Het eerste voorbeeld heeft een sterkere typecontrole, het tweede is flexibeler. Het eerste voorbeeld produceert minder code en executeert sneller.
  
   Programmeerconcept
   Datastructuur