如何使用可选元素初始化对的C ++ 17向量


34

在C ++ 17中,如何声明和初始化带有可选元素的对(或元组)向量?

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

我有一对,其中第二个元素可能为null /可选。


1
std::piecewise_construct也可以提供有趣的选择。
Marc Glisse


@JulienLopez谈论分配。
LF

@LF删除不相关的上下文时,这是同样的问题:如何创建一个空的可选内容?
朱利安·洛佩兹

1
@JulienLopez在C ++中,初始化和赋值通常大不相同。仅仅因为两个问题碰巧具有重叠的解决方案,并不意味着它们是相同的。特别要注意的是,您不想在reset这里使用。
LF

Answers:


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“更加理智地阅读”是主观的。可读性争论的另一面是这样的:我不希望有去所有的回文件的开头方式找出哪个特定的 vectorpairoptional正在使用这一行,等等。我。内联包含名称空间的内容可以明确地告诉我该函数的来源和作用。这条线是独立的。对于较大的项目尤其如此(因为它完全避免了名称空间冲突),但对于简洁的代码示例也很有用。
probably_someone

3
@ Alexander-ReinstateMonica如果您对使用您刚刚编写的代码的任何代码进行完全监督和控制,那么这种逻辑就很好(因为这样您就可以准确地知道何时发生“发生冲突的情况”)。但是,如果您正在做的事情(例如,开发旨在供其他开发人员使用的库或API),则您将无法监督每种用法来确定是否/何时发生此类冲突。通常,在这种情况下(相对常见)最好避免冲突,而不是仅在有人抱怨您的产品损坏后才进行修复。
可能

3
@ Alexander-ReinstateMonica您会立即意识到以下哪个是顶级名称stdargcountfindsize
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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.