Як ініціалізувати C ++ 17 векторних пар з додатковим елементом


34

Як в C ++ 17 як оголосити і ініціалізувати вектор пар (або кортежів) з необов'язковим елементом?

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

У мене є пара, де другий елемент може бути нульовим / необов’язковим.


1
std::piecewise_constructтакож може запропонувати цікаві альтернативи.
Марк Глісс

4
Чи відповідає це на ваше запитання? Як призначити "нічого" std :: необов'язково <T>?
Жульєн Лопес

@JulienLopez Це говорить про призначення.
LF

@LF Це те саме питання, коли ви видаляєте невідповідний контекст: як створити порожній необов'язковий?
Жульєн Лопес

1
@JulienLopez У C ++ ініціалізація та призначення в цілому дуже різні. Тільки тому, що ці два питання мають рішення, що перекриваються, не означає, що вони однакові. Зокрема, зверніть увагу, що ви не хочете resetтут використовувати .
LF

Відповіді:


49

Ви шукаєте std::nulloptзамість nullptr.

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>>? Читає набагато чесніше
Олександр -

17
@ Alexander-ReinstateMonica "Читає набагато здоровіше" є суб'єктивною. Зворотний бік читання аргумент що - щось на зразок цього: Я не хочу , щоб пройти весь шлях назад у верхній частині файлу , щоб з'ясувати , які саме vector , pair, optionalі т.д. , я використовую в цьому рядку. Включення простору імен вбудовано підказує мені однозначно, звідки ця функція походить і що вона робить; рядок є самостійним. Особливо це стосується великих проектів (оскільки це повністю уникає конфліктів у просторі імен), але також корисно для стислих прикладів коду.
напевно_друга

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краще повідомляйте про наміри.
Вілліхам Тотланд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.