Oui et non.
1. Tableau local : Non, mais vous pouvez facilement trouver la taille
Si vous avez un tableau local ( int numbers[4] = {1, 2, 3, 4];
), vous pouvez alors faire size = sizeof(numbers) / sizeof(int)
.
2. Pointeur vers le tableau : Pas du tout, vous devez passer la taille séparément.
Si vous avez un pointeur sur un tableau ( int* numbers = new int[4];
), vous ne pouvez pas déterminer la taille à moins d'en tenir compte vous-même. (ou si elle est à terminaison nulle dans le cas d'une chaîne c, mais alors vous devez itérer à travers elle ce qui est un temps de fonctionnement linéaire...)
Notez que je ne pense pas qu'un pointeur vers un tableau soit la terminologie appropriée. En fait, vous avez juste un pointeur vers le premier élément du tableau, mais l'espace pour plusieurs valeurs a été alloué. Je ne sais pas comment cela s'appelle. Peut-être juste un pointeur ?
3. Conteneurs STL : Oui, et vous pouvez faire un peu de magie de boucle for en utilisant des itérateurs, ou simplement utiliser des indices en obtenant la taille
Si vous avez un vecteur ( std::vector<int> v(3, 0);
), vous pouvez alors l'itérer de la manière suivante :
C++11 :
auto it = v.begin();
for (auto it = v.begin(); it != v.end(); it++)
{
UseElement(*it);
}
Ou apparemment (également C++11, merci jrok) :
for (const int& i : v) { UseElement(i); }
C++ (pré-11) :
std::vector<int>::iterator it;
for (it = v.begin(); it != v.end(); it++)
{
UseElement(*it);
}
Ou en utilisant des indices :
for (int i = 0; i < v.size(); i++)
{
UseElement(v[i]);
}
En outre, vous pouvez utiliser des pointeurs de fonction ou des foncteurs avec des conteneurs STL à l'aide de la fonction for_each de std algorithm ( #include <algorithm>
) comme suit :
void foo(int i)
{
std::cout << i;
}
{
std::for_each(myvector.begin(), myvector.end(), foo);
}