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

Eug*_*ene 36 c++ vector optional std-pair c++17

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

    std::vector<std::pair<int, optional<bool> > > vec1 = { {1, true},
                                                           {2, false}, 
                                                           {3, nullptr}};
Run Code Online (Sandbox Code Playgroud)

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

bit*_*ask 53

您正在寻找std::nullopt而不是nullptr.

std::vector<std::pair<int, std::optional<bool> > > vec1 =
  { {1, true}, {2,false}, {3,std::nullopt} };
Run Code Online (Sandbox Code Playgroud)

  • @Alexander-ReinstateMonica “读得更理智”是主观的。可读性参数的另一面是这样的:我不想一直回到文件顶部来找出_哪个特定_“向量”、“对”、“可选”等。我在这一行使用。内联包含命名空间可以明确地告诉我该函数来自哪里以及它的作用;该生产线是独立的。对于较大的项目尤其如此(因为它完全避免了命名空间冲突),而且对于简洁的代码示例也很有用。 (19认同)
  • @Alexander-ReinstateMonica,对我来说,`std::` 完全不引人注目。如果命名空间的名称更长,情况会有所不同。 (4认同)
  • (来自热门网络问题链接)C++ 代码是否总是像这样垃圾邮件“std::”?为什么不只是“使用 std::vector”和朋友,这样你就可以写“vector&lt;pair&lt;int, optional&lt;bool&gt;&gt;”?读起来更加理智 (3认同)
  • @Alexander-ReinstateMonica 如果您对使用您刚刚编写的代码的任何代码有完全的监督和控制,那么这种逻辑就很好(因为这样您就可以准确地知道“发生冲突的情况”何时发生)。但是,如果您正在做类似的事情,例如开发一个供其他开发人员使用的库或 API,您就无法监督每一次使用来确定是否/何时发生此类冲突。在这种(相对常见的)情况下,预防冲突通常比在有人抱怨您的产品损坏后才修复冲突更好。 (3认同)
  • @Alexander-ReinstateMonica 您立即意识到以下哪一个是来自“std”的顶级名称?`arg`、`count`、`find`、`size` (3认同)
  • @Alexander-ReinstateMonica 比你想象的更频繁。这只是一个例子:/sf/ask/1695195001/ (2认同)
  • @Alexander-ReinstateMonica 这是另一个,根本不涉及 C:/sf/ask/930495051/ (2认同)

Mar*_*k R 25

或者简单使用默认构造:

std::vector<std::pair<int, std::optional<bool>>> vec1 {
    {1, true}, {2,false}, {3,{}}
};
Run Code Online (Sandbox Code Playgroud)

  • 虽然这有效,但“std::nullopt”可以更好地传达意图。 (6认同)