een lange titel

STL algoritmen met C array en C++ vector

In dit voorbeeld wordt getoond dat je een for_each algoritme zowel bij een C array als bij een C++ vector kan toepassen.

Het is weinigen opgevallen dat de STL algoritmen en de iterators teruggrijpen naar het verband tussen arrays en pointers dat in C bestaat. Het volgende voorbeeld maakt gebruik van het for_each algoritme. Dit algoritme wordt tweemaal toegepast: éénmaal op een vector en éénmaal op een C array. En merkwaardig genoeg kan for_each samenwerken met een C array.

Dit is het voorbeeld.

  • svb3.cpp

Broncode: svb3.cpp

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
   std::vector<int> tab = { 3, 5, 7, 8, 9};

   std::for_each(tab.begin(), tab.end(), 
   [](const int &a) 
   { 
      std::cout << a << std::endl; 
   });

   int tab2[] = { 30, 50, 70, 80, 90};

   std::for_each(tab2, &tab2[5], 
   [](const int &a) 
   { 
      std::cout << a << std::endl; 
   });
}

Eerst wordt de tab vector gedeclareerd en geïnitialiseerd. Daarna start de for_each; de derde parameter is de lambdafunctie en die is helemaal niet speciaal. De eerste en tweede parameter tab.begin() en tab.end() zijn iteratoren die het begin en het einde van de vector aangeven. Hierdoor weet het algoritme waar te beginnen en waar te eindigen.

Voor de tweede oproep van het algoritme wordt het begin en het einde van een array meegegeven als parameter. Dit is een stap terug in de tijd omdat we in C++ liever met C++ containers werken. Het opmerkelijke is nu dat we in plaats van iteratoren ook adressen kunnen meegeven. Dit wordt er als parameter meegegeven:

  • tab2, het adres van het begin van de array
  • &tab[5], het adres van het einde van de array. Het einde is gedefiniëerd als het adres van de eerste byte die niet meer tot de array behoort.

Dit maakt dat we nog altijd arrays kunnen gebruiken in combinatie met C++ containers. En dat het nuttig blijft om C pointers te begrijpen.