【问题标题】:How to initialize C++17 vector of pairs with optional element如何使用可选元素初始化 C++17 对向量
【发布时间】:2020-06-23 03:23:45
【问题描述】:

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

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

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

【问题讨论】:

  • std::piecewise_construct 也可以提供有趣的替代方案。
  • 这能回答你的问题吗? How to assign "nothing" to std::optional<T>?
  • @JulienLopez 那是在谈论分配。
  • @L.F.当你删除不相关的上下文时,同样的问题是:你如何创建一个空的可选?
  • @JulienLopez 在 C++ 中,初始化和赋值通常非常不同。仅仅因为这两个问题恰好有重叠的解决方案并不意味着它们是相同的。特别要注意,您不想在此处使用reset

标签: c++ vector c++17 optional std-pair


【解决方案1】:

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

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

【讨论】:

  • (来自热门网络问题链接)C++ 代码是否总是像这样发送垃圾邮件std::?为什么不只是using std::vector 和朋友,所以你可以写vector&lt;pair&lt;int, optional&lt;bool&gt;&gt;?读起来更清醒
  • @Alexander-ReinstateMonica “读起来更理智”是主观的。可读性参数的另一面是这样的:我不想一直回到文件顶部来找出 哪个特别 vector, pairoptional 等。我在这一行中使用。包括命名空间内联清楚地告诉我该函数来自哪里以及它做什么;这条线是独立的。对于较大的项目尤其如此(因为它完全避免了命名空间冲突),但对于简洁的代码示例也很有用。
  • @Alexander-ReinstateMonica 如果您对使用您刚刚编写的代码的任何代码有完全的监督和控制权,那么这个逻辑就很好(因为这样您就可以准确地知道“发生冲突的关闭情况”何时发生)。但是,如果你正在做一些事情,例如,开发一个供其他开发人员使用的库或 API,你就不能监督每一个使用情况来确定是否/何时发生这种冲突。在这种(相对常见的)情况下,预防碰撞通常会更好,而不是仅在有人抱怨您的产品损坏后才修复它们。
  • @Alexander-ReinstateMonica 您立即意识到以下哪个是来自std 的顶级名称? arg, count, find, size
  • @Alexander-ReinstateMonica,对我来说,std:: 完全不显眼。如果命名空间的名称更长,情况会有所不同。
【解决方案2】:

或者简单的使用默认构造:

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

【讨论】:

  • 虽然这很有效,但std::nullopt 可以更好地传达意图。
猜你喜欢
  • 2021-01-22
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多