La solución de vector propuesta copia la matriz (solo los punteros, no las cadenas - pero aún así). Unnessary. La solución argv_range es lo que habría intentado, también, si quisiera forzar un ciclo basado en rango. Pero eso produce una gran cantidad de código adicional (admitido, solo una vez, si lo escribe en un archivo de encabezado y lo conserva, pero aún así).
El bucle clásico parece tan fácil para mí que me permito sólo para el post-it, no considero que vale la pena tener todo este esfuerzo sólo para tener un bucle basado gama ...
for (char** a = argv; *a; ++a)
{
// use *a, or if you don't like:
char* arg = *a;
// use arg...
}
o, si usted no necesitará siempre la matriz argv más tarde:
for (++argv; *argv; ++argv)
{
// use *argv, or if you don't like:
char* a = *argv;
// use a...
}
Hay una pequeña diferencia, usted puede haber notado: en la primera variante, que iterar sobre todos los valores, en el segundo , Dejo fuera el primero (que normalmente es el nombre del programa no estamos intere sted in en muchos casos). A la inversa, para cada uno:
for (char** a = argv + 1; *a; ++a);
for (; *argv; ++argv);
Esto se aplica únicamente, si utiliza std::vector<char*>
; si usa std::vector<std::string>
, como realmente se propone, ¡incluso las cadenas se copian!
Tenga en cuenta que (dependiendo, por supuesto, de la naturaleza de los posibles argumentos y el tipo de procesamiento que está tratando de hacer en ellos) utilizando un bucle for basado en rango en esta situación específica puede ser bastante limitante, porque estás obligado a procesar un argumento por iteración de bucle. El uso de un iterador explícito (o un puntero) le permite avanzar inmediatamente de un argumento al siguiente, a menudo la acción deseada al procesar argumentos como "-f miarchivo.out". Con un bucle for basado en rango, es probable que termines necesitando variables de estado explícitas o similares. – Jeremy