İsteğe bağlı öğe ile çiftlerin C ++ 17 vektörünü başlatma


34

C ++ 17'de, isteğe bağlı bir öğeyle bir çift (veya tuple) vektörünü nasıl bildirir ve başlatırsınız?

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

Ben ikinci eleman null / isteğe bağlı olabilir bir çift var.


1
std::piecewise_constructilginç alternatifler de sunabilir.
Marc Glisse


@JulienLopez Bu ödevden bahsediyor.
LF

@LF Alakasız içeriği kaldırdığınızda da aynı soru geçerlidir: Boş bir isteğe bağlı nasıl yaratırsınız?
Julien Lopez

1
@JulienLopez C ++ 'da başlatma ve atama genel olarak çok farklıdır. İki sorunun örtüşen çözümlere sahip olması, bunların aynı olduğu anlamına gelmez. Özellikle, resetburada kullanmak istemediğinizi unutmayın .
LF

Yanıtlar:


49

Bunun std::nulloptyerine arıyoruz nullptr.

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

3
(Buraya sıcak ağ soruları bağlantısından geliyor) C ++ kodu her zaman std::böyle spam yapıyor mu? Neden sadece using std::vectorve arkadaşlar değil , sadece yazabilirsiniz vector<pair<int, optional<bool>>? Daha akılcı bir şekilde okur
Alexander -

17
@ Alexander-ReinstateMonica "Daha akılcı şekilde okur" özneldir. Okunabilirliği argüman kapak tarafı böyle bir şeydir: Ben hepsini şekle dosyanın üstüne yolu geri gitmek zorunda istemiyorum hangi özellikle vector , pair, optionalbu çizgide kullanıyorum, vb ben. Ad alanına satır içi eklemek, bu işlevin nereden geldiğini ve ne yaptığını açık bir şekilde anlatır; hat bağımsızdır. Bu özellikle daha büyük projeler için geçerlidir (ad alanı çatışmalarından tamamen kaçındığı için), ancak kısa kod örnekleri için de yararlıdır.
muhtemelen

3
@ Alexander-ReinstateMonica Az önce yazdığınız kodu kullanan herhangi bir kod üzerinde tam denetiminiz ve denetiminiz varsa, bu mantık iyidir (çünkü o zaman tam olarak "çarpışmaların meydana geldiği bir kapalı durum" meydana geldiğini bilirsiniz). Ancak, örneğin bir grup diğer geliştirici tarafından kullanılmak üzere tasarlanmış bir kütüphane veya API geliştirmek gibi bir şey yapıyorsanız, böyle bir çarpışma olup olmadığını / ne zaman ortaya çıkacağını anlamak için her bir kullanımı denetleyemezsiniz. Bu (nispeten yaygın) durumda, çarpışmaları önceden boşaltmak genellikle, yalnızca biri ürününüzün kırıldığından şikayet ettikten sonra düzeltmek yerine daha iyidir.
muhtemelen

3
@ Alexander-ReinstateMonica Aşağıdakilerden hangisinin hemen üst düzey bir isim olduğunu anlıyorsunuz std? arg, count, find,size
LF

4
@ Alexander-ReinstateMonica, bana std::göre tamamen mütevazi. Ad alanının adı çok daha uzun olsaydı farklı olurdu.
Carsten S

24

Veya basit kullanım varsayılan yapısı:

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

6
Bu çalışırken, std::nulloptniyet daha iyi iletişim kurar.
Williham Totland
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.