Cómo inicializar el vector de pares C ++ 17 con elemento opcional

34

En C ++ 17, ¿cómo declara e inicializa un vector de pares (o tuplas) con un elemento opcional?

    std::vector<std::pair<int, optional<bool> > > vec1 = { {1, true},
                                                           {2, false}, 
                                                           {3, nullptr}};

Tengo un par donde el segundo elemento puede ser nulo / opcional.

Eugene
fuente
1
std::piecewise_constructTambién puede proporcionar alternativas interesantes.
Marc Glisse
44
¿Responde esto a tu pregunta? ¿Cómo asignar "nada" a std :: opcional <T>?
Julien Lopez
@JulienLopez Eso está hablando de asignación.
LF
@LF Es la misma pregunta cuando eliminas el contexto irrelevante: ¿cómo creas un opcional vacío?
Julien Lopez
1
@JulienLopez En C ++, la inicialización y la asignación son muy diferentes en general. El hecho de que las dos preguntas tengan soluciones superpuestas no significa que sean las mismas. En particular, tenga en cuenta que no desea usar resetaquí.
LF

Respuestas:

49

Estás buscando en std::nulloptlugar de nullptr.

std::vector<std::pair<int, std::optional<bool> > > vec1 =
  { {1, true}, {2,false}, {3,std::nullopt} };
máscara de bits
fuente
3
(Viniendo desde el enlace de preguntas de la red) ¿El código C ++ siempre es spam std::como este? ¿Por qué no solo using std::vectory amigos, para que puedas escribir vector<pair<int, optional<bool>>? Lee mucho más sanamente
Alexander - Restablece a Mónica el
17
@ Alexander-ReinstateMonica "Lee mucho más sanamente" es subjetivo. La otra cara del argumento legibilidad es algo como esto: yo no quiero tener que ir hasta la parte posterior hasta la parte superior del archivo de averiguar lo que en particular vector , pair, optional, etc estoy usando en esta línea. La inclusión del espacio de nombres en línea me dice inequívocamente de dónde proviene esa función y qué hace; La línea es autónoma. Esto es especialmente cierto para proyectos más grandes (ya que evita los conflictos de espacio de nombres por completo), pero también es útil para ejemplos de código conciso.
probablemente_alguien
3
@ Alexander-ReinstateMonica Esa lógica está bien si tienes supervisión y control total sobre cualquier código que use el código que acabas de escribir (porque entonces sabes exactamente cuándo ocurre un "caso fuera de lugar en el que ocurren colisiones"). Pero si está haciendo algo como, por ejemplo, desarrollar una biblioteca o una API que está destinada a ser utilizada por un grupo de otros desarrolladores, no puede supervisar cada uso para determinar si se produce dicha colisión. Por lo general, es mejor en ese caso (relativamente común) evitar las colisiones, en lugar de arreglarlas solo después de que alguien se queja de que su producto está roto.
probablemente_alguien
3
@ Alexander-ReinstateMonica ¿De cuál de los siguientes se da cuenta inmediatamente de que es un nombre de nivel superior std? arg, count, find,size
LF
44
@ Alexander-ReinstateMonica, para mí, std::es totalmente discreto. Sería diferente si el nombre del espacio de nombres fuera mucho más largo.
Carsten S
24

O uso simple construcción predeterminada:

std::vector<std::pair<int, std::optional<bool>>> vec1 {
    {1, true}, {2,false}, {3,{}}
};
Marek R
fuente
66
Mientras esto funciona, std::nulloptcomunica mejor la intención.
Williham Totland