วิธีการเริ่มต้น C ++ 17 เวกเตอร์ของคู่ด้วยองค์ประกอบเสริม


34

ใน C ++ 17 คุณจะประกาศและกำหนดค่าเริ่มต้นเวกเตอร์ของคู่ (หรือ tuples) ด้วยองค์ประกอบเสริมได้อย่างไร

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

ฉันมีคู่ที่องค์ประกอบที่สองอาจเป็นโมฆะ / ไม่จำเป็น


1
std::piecewise_constructยังสามารถให้ทางเลือกที่น่าสนใจ
Marc Glisse

4
สิ่งนี้ตอบคำถามของคุณหรือไม่ วิธีกำหนด "nothing" ให้กับ std :: optional <T>
Julien Lopez

@JulienLopez พูดถึงงานที่มอบหมาย
LF

@LF เป็นคำถามเดียวกันเมื่อคุณลบบริบทที่ไม่เกี่ยวข้อง: คุณจะสร้างตัวเลือกที่ว่างได้อย่างไร
Julien Lopez

1
@JulienLopez ใน C ++ การเริ่มต้นและการกำหนดแตกต่างกันมากโดยทั่วไป เพียงเพราะทั้งสองคำถามมีปัญหาการซ้อนทับกันไม่ได้หมายความว่าพวกเขาเหมือนกัน โดยเฉพาะอย่างยิ่งโปรดทราบว่าคุณไม่ต้องการใช้resetที่นี่
LF

คำตอบ:


49

คุณกำลังมองหาแทนstd::nulloptnullptr

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

3
(มาที่นี่จากลิงก์คำถามเครือข่ายที่น่าสนใจ) รหัส C ++ เป็นสแปมเสมอstd::เช่นนี้หรือไม่ ทำไมไม่เพียงusing std::vectorและเพื่อน ๆ ดังนั้นคุณก็สามารถเขียนvector<pair<int, optional<bool>>? อ่านอย่างมีสติมากขึ้น
Alexander - Reinstate Monica

17
@ Alexander-ReinstateMonica "อ่านอย่างมีสติมากขึ้น" เป็นอัตนัย พลิกด้านของการโต้แย้งการอ่านเป็นบางอย่างเช่นนี้ฉันไม่ต้องการที่จะมีไปตลอดทางกลับไปที่ด้านบนของไฟล์ที่จะคิดออกซึ่งโดยเฉพาะอย่างยิ่ง vector , pair,optionalฯลฯ ฉันใช้ในสายนี้ การรวม namespace inline บอกให้ฉันทราบอย่างชัดเจนว่าฟังก์ชันนั้นมาจากที่ใดและทำอะไรได้บ้าง บรรทัดอยู่ในตัวเอง สิ่งนี้เป็นจริงอย่างยิ่งสำหรับโครงการขนาดใหญ่ (เนื่องจากหลีกเลี่ยงความขัดแย้งของเนมสเปซทั้งหมด) แต่ก็มีประโยชน์สำหรับตัวอย่างโค้ดที่กระชับ
อาจ

3
@ Alexander-ReinstateMonica ตรรกะนั้นใช้ได้ถ้าคุณมีการควบคุมเต็มรูปแบบและควบคุมรหัสใด ๆ ที่ใช้รหัสที่คุณเพิ่งเขียน (เพราะเมื่อนั้นคุณจะรู้ได้อย่างแม่นยำว่าเกิดกรณี "การชนซึ่งเกิดการชน" ขึ้น) แต่ถ้าคุณทำบางอย่างเช่นการพัฒนาห้องสมุดหรือ API ที่มีไว้สำหรับนักพัฒนากลุ่มอื่น ๆ คุณไม่สามารถควบคุมการใช้งานทุกครั้งเพื่อให้ทราบว่าการชนเกิดขึ้นเมื่อใด โดยปกติแล้วจะดีกว่าในกรณี (ค่อนข้างบ่อย) ในการชนกันของข้อมูลก่อนล่วงหน้าแทนที่จะแก้ไขเมื่อมีคนบ่นว่าผลิตภัณฑ์ของคุณเสีย
อาจ

3
@ Alexander-ReinstateMonica ข้อใดต่อไปนี้ที่คุณตระหนักในทันทีคือชื่อระดับบนสุดจากstd? arg, count, find,size
LF

4
@ Alexander-ReinstateMonica สำหรับฉันนั้นstd::ไม่มีอะไรรบกวนเลย มันจะแตกต่างกันถ้าชื่อของเนมสเปซนั้นยาวกว่ามาก
Carsten S

24

หรือใช้ค่าเริ่มต้นง่ายๆในการสร้าง:

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

6
ในขณะที่ใช้งานได้std::nulloptดีขึ้นสื่อสารความตั้งใจ
Williham Totland
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.