Come inizializzare il vettore C ++ 17 di coppie con elemento opzionale


34

In C ++ 17, come si dichiara e inizializza un vettore di coppie (o tuple) con un elemento opzionale?

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

Ho una coppia in cui il secondo elemento può essere nullo / facoltativo.


1
std::piecewise_constructpuò anche fornire alternative interessanti.
Marc Glisse,


@JulienLopez Sta parlando di incarico.
LF

@LF È la stessa domanda quando si rimuove il contesto irrilevante: come si crea un optional vuoto?
Julien Lopez,

1
@JulienLopez In C ++, l'inizializzazione e l'assegnazione sono molto diverse in generale. Solo perché le due domande hanno soluzioni sovrapposte non significa che siano le stesse. In particolare, si noti che non si desidera utilizzare resetqui.
LF

Risposte:


49

Stai cercando std::nulloptinvece di nullptr.

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

3
(Venendo qui dal collegamento alle domande sulla rete attiva) Il codice C ++ fa sempre spam in std::questo modo? Perché non solo using std::vectore amici, quindi potresti semplicemente scrivere vector<pair<int, optional<bool>>? Legge molto più saggiamente
Alexander - Ripristina Monica l'

17
@ Alexander-ReinstateMonica "Legge molto più saggiamente" è soggettivo. Il rovescio della medaglia dell'argomento leggibilità è qualcosa del genere: non voglio tornare indietro fino all'inizio del file per capire quale particolare vector , pair, optional, ecc sto usando in questa linea. Includere lo spazio dei nomi in linea mi dice inequivocabilmente da dove proviene quella funzione e cosa fa; la linea è autonoma. Ciò è particolarmente vero per i progetti più grandi (poiché evita del tutto i conflitti dello spazio dei nomi), ma è utile anche per esempi di codice concisi.
probably_someone

3
@ Alexander-ReinstateMonica Quella logica va bene se hai la supervisione e il controllo completi su qualsiasi codice che utilizza il codice che hai appena scritto (perché allora sai esattamente quando si verifica un "caso off in cui si verificano collisioni"). Ma se stai facendo qualcosa come, ad esempio, lo sviluppo di una libreria o un'API che è destinata all'uso da un gruppo di altri sviluppatori, non puoi supervisionare ogni singolo utilizzo per capire se / quando si verifica una tale collisione. Di solito è meglio in quel caso (relativamente comune) prevenire le collisioni, piuttosto che risolverle solo dopo che qualcuno si lamenta che il tuo prodotto è rotto.
probably_someone

3
@ Alexander-ReinstateMonica Da quale delle seguenti realizzi immediatamente un nome di primo livello std? arg, count, find,size
LF

4
@ Alexander-ReinstateMonica, per me, std::è totalmente discreto. Sarebbe diverso se il nome dello spazio dei nomi fosse molto più lungo.
Carsten S

24

O semplice costruzione di default:

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

6
Mentre funziona, std::nulloptcomunica meglio l'intento.
Williham Totland,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.