Cara menginisialisasi C ++ 17 vektor pasangan dengan elemen opsional

34

Dalam C ++ 17, bagaimana Anda mendeklarasikan dan menginisialisasi vektor pasangan (atau tupel) dengan elemen opsional?

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

Saya memiliki pasangan di mana elemen kedua mungkin nol / opsional.

Eugene
sumber
1
std::piecewise_constructjuga bisa memberikan alternatif yang menarik.
Marc Glisse
4
Apakah ini menjawab pertanyaan Anda? Bagaimana cara menetapkan "tidak ada" ke std :: opsional <T>?
Julien Lopez
@JulienLopez Itu berbicara tentang tugas.
LF
@ LF Ini pertanyaan yang sama ketika Anda menghapus konteks yang tidak relevan: bagaimana Anda membuat opsional kosong?
Julien Lopez
1
@JulienLopez Dalam C ++, inisialisasi dan tugas sangat berbeda secara umum. Hanya karena dua pertanyaan kebetulan memiliki solusi yang tumpang tindih tidak berarti bahwa keduanya sama. Secara khusus, perhatikan bahwa Anda tidak ingin menggunakannya di resetsini.
LF

Jawaban:

49

Anda mencari std::nulloptbukan nullptr.

std::vector<std::pair<int, std::optional<bool> > > vec1 =
  { {1, true}, {2,false}, {3,std::nullopt} };
bitmask
sumber
3
(Datang ke sini dari tautan pertanyaan jaringan panas) Apakah kode C ++ selalu spam std::seperti ini? Mengapa tidak adil using std::vectordan berteman, sehingga Anda bisa menulis vector<pair<int, optional<bool>>? Membaca jauh lebih waras
Alexander - Reinstate Monica
17
@ Alexander-ReinstateMonica "Membaca dengan cara yang lebih sehat" adalah subyektif. Sisi lain dari argumen pembacaan adalah sesuatu seperti ini: Saya tidak mau harus pergi semua kembali jalan ke atas file untuk mencari tahu yang tertentu vector , pair, optional, dll saya menggunakan di baris ini. Termasuk inline namespace memberi tahu saya dengan jelas dari mana fungsi itu berasal dan apa fungsinya; barisnya mandiri. Ini terutama berlaku untuk proyek yang lebih besar (karena menghindari konflik namespace sepenuhnya), tetapi juga berguna untuk contoh kode ringkas.
maybe_someone
3
@ Alexander-ReinstateMonica Logika itu baik-baik saja jika Anda memiliki pengawasan penuh dan kontrol atas kode apa pun yang menggunakan kode yang baru saja Anda tulis (karena Anda tahu persis kapan "kasus di mana tabrakan terjadi" terjadi). Tetapi jika Anda melakukan sesuatu seperti, misalnya, mengembangkan perpustakaan atau API yang dimaksudkan untuk digunakan oleh sekelompok pengembang lain, Anda tidak dapat mengawasi setiap penggunaan tunggal untuk mengetahui apakah / ketika tabrakan tersebut terjadi. Biasanya lebih baik dalam hal (relatif umum) untuk menghindari tabrakan, daripada memperbaikinya hanya setelah seseorang mengeluh bahwa produk Anda rusak.
maybe_someone
3
@ Alexander-ReinstateMonica Manakah dari berikut ini yang segera Anda sadari berasal dari nama tingkat atas std? arg, count, find,size
LF
4
@ Alexander-ReinstateMonica, bagi saya, std::sama sekali tidak mengganggu . Akan berbeda jika nama namespace lebih panjang.
Carsten S
24

Atau konstruksi standar penggunaan sederhana:

std::vector<std::pair<int, std::optional<bool>>> vec1 {
    {1, true}, {2,false}, {3,{}}
};
Marek R
sumber
6
Sementara ini berhasil, std::nulloptmaksud komunikasi lebih baik.
Williham Totland