Editar: C++ 11 se introdujo desde esta respuesta fue escrito, e incluye funciones para hacer exactamente lo que muestro a continuación: std::begin
y std::end
. Las versiones de Const std::cbegin
y std::cend
también van a una versión futura del estándar (C++ 14?) Y pueden estar ya en su compilador. Ni siquiera considere usar mis funciones a continuación si tiene acceso a las funciones estándar.
Me gustaría construir un poco en
Benoît's answer.
En lugar de pasar solo la dirección de inicio de la matriz como un puntero, o un puntero más el tamaño sugerido por otros, tome como referencia la biblioteca estándar y pase dos punteros al principio y al final de la matriz. Esto no solo hace que tu código se parezca más al C++ moderno, ¡sino que puedes utilizar cualquiera de los algoritmos de biblioteca estándar en tu matriz!
template<typename T, int N>
T * BEGIN(T (& array)[N])
{
return &array[0];
}
template<typename T, int N>
T * END(T (& array)[N])
{
return &array[N];
}
template<typename T, int N>
const T * BEGIN_CONST(const T (& array)[N])
{
return &array[0];
}
template<typename T, int N>
const T * END_CONST(const T (& array)[N])
{
return &array[N];
}
void
foo(int * begin, int * end)
{
printf("arr : %x\n", begin);
printf ("sizeof arr: %d\n", end - begin);
}
int
main()
{
int arr[] = {1, 2, 3, 4};
printf("arr : %x\n", arr);
printf ("sizeof arr: %d\n", END(arr) - BEGIN(arr));
foo(BEGIN(arr), END(arr));
}
Aquí hay una definición alternativa para BEGIN y END, si las plantillas no funcionan.
#define BEGIN(array) array
#define END(array) (array + sizeof(array)/sizeof(array[0]))
Actualización: El código anterior con las plantillas trabaja en MS VC++ 2005 y GCC 3.4.6, como debe ser. Necesito obtener un nuevo compilador.
También estoy reconsiderando la convención de nomenclatura utilizada aquí: las funciones de plantilla enmascaradas como macros simplemente se sienten mal. Estoy seguro de que usaré esto en mi propio código pronto, y creo que usaré ArrayBegin, ArrayEnd, ArrayConstBegin y ArrayConstEnd.
Llamar al parámetro foo con el mismo nombre hace que esta intuición sea intuitiva para usted. Considere darle otro nombre para simular lo que está mirando el compilador. – ojblass