¿Es posible declarar dos variables de diferentes tipos en el cuerpo de inicialización de un bucle for en C ++?
Por ejemplo:
for(int i=0,j=0 ...
define dos enteros. ¿Puedo definir una int
y a char
en el cuerpo de inicialización? ¿Cómo se haría esto?
c++
scope
declaration
for-loop
Nathan Osman
fuente
fuente
-std=c++0x
) en forma defor(auto i=0, j=0.0; ...
, pero esta posibilidad se eliminó en g ++ - 4.5 para coincidir con los textos de c ++ 0x.Respuestas:
C ++ 17 : ¡Sí! Debe usar una declaración vinculante estructurada . La sintaxis ha sido compatible con gcc y clang durante años (desde gcc-7 y clang-4.0) ( ejemplo de clang live ). Esto nos permite descomprimir una tupla así:
Lo anterior te dará:
int i
ajustado a1
double f
ajustado a1.0
std::string s
ajustado a"ab"
Asegúrese de que
#include <tuple>
para este tipo de declaración.Puede especificar los tipos exactos dentro
tuple
de, escribiéndolos todos como tengo con elstd::string
, si desea nombrar un tipo. Por ejemplo:Una aplicación específica de esto es iterar sobre un mapa, obtener la clave y el valor,
Vea un ejemplo en vivo aquí
C ++ 14 : puede hacer lo mismo que C ++ 11 (a continuación) con la adición de tipo basado
std::get
. Entonces, en lugar delstd::get<0>(t)
ejemplo a continuación, puede tenerstd::get<int>(t)
.C ++ 11 : le
std::make_pair
permite hacer esto, así comostd::make_tuple
para más de dos objetos.std::make_pair
devolverá los dos argumentos en astd::pair
. Se puede acceder a los elementos con.first
y.second
.Para más de dos objetos, deberá usar un
std::tuple
std::make_tuple
es una plantilla variada que construirá una tupla de cualquier número de argumentos (con algunas limitaciones técnicas, por supuesto). Se puede acceder a los elementos por índice constd::get<INDEX>(tuple_object)
Dentro de los cuerpos del bucle for puede alias fácilmente los objetos, aunque todavía necesita usar
.first
ostd::get
para la condición del bucle for y actualizar la expresiónC ++ 98 y C ++ 03 Puede nombrar explícitamente los tipos de a
std::pair
. Sin embargo, no hay una forma estándar de generalizar esto a más de dos tipos:fuente
make_
y escribirstd::pair(1, 1.0)
.No, pero técnicamente hay una solución alternativa (no es que realmente lo use a menos que me obligue):
fuente
struct { int a=0; char b='a'; } s;
No es posible, pero puedes hacer:
O limite explícitamente el alcance
f
y eli
uso de corchetes adicionales:fuente
No puede declarar varios tipos en la inicialización, pero puede asignar a varios tipos EG
Simplemente declararlos en su propio alcance.
fuente
Creo que el mejor enfoque es la respuesta de xian .
pero...
# Anidado para bucle
Este enfoque es sucio, pero puede resolverse en todas las versiones.
entonces, a menudo lo uso en funciones macro.
Adicional 1.
También se puede usar para
declare local variables
yinitialize global variables
.Adicional 2.
Buen ejemplo: con función macro.
(Si el mejor enfoque no se puede usar porque es una macro para bucle for)
# Truco de declaración if
Si desea inicializar a
0
onullptr
, puede utilizar este truco.pero no recomiendo esto debido a la lectura difícil.
y parece un error
fuente
Consulte " ¿Hay alguna forma de definir variables de dos tipos en for loop? " Para conocer otra forma de anidar múltiples for loops. La ventaja de la otra manera sobre el "truco de estructura" de Georg es que (1) le permite tener una mezcla de variables locales estáticas y no estáticas y (2) le permite tener variables no copiables. La desventaja es que es mucho menos legible y puede ser menos eficiente.
fuente
Definir una macro:
Solo recuerde, sus ámbitos variables tampoco estarán dentro del ciclo for de esta manera.
fuente
{
y}
.También podría usar como a continuación en C ++.
fuente