首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >访问std::optional中的std::vector方法

访问std::optional中的std::vector方法
EN

Stack Overflow用户
提问于 2021-07-14 17:40:27
回答 3查看 68关注 0票数 0

我有一个元素,它是std::optional中的std::vector。现在我想把一个元素放到向量中(通过emplace_back):

代码语言:javascript
运行
复制
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <optional>

int main()
{
    std::optional<std::vector<uint8_t>> optvec;
    optvec->reserve(1);

    optvec->emplace_back(1);

    std::cout << optvec.has_value() << std::endl;

    return 0;
}

但是,对于内存,这会正确地嵌入元素本身,但可选部分不会得到存在元素的信息,所以它是一个nullopt。

有没有其他方法可以做到这一点?提前谢谢。

EN

回答 3

Stack Overflow用户

发布于 2021-07-14 17:45:54

当你这样做的时候

代码语言:javascript
运行
复制
std::optional<std::vector<uint8_t>> optvec;
optvec->reserve(1);

你的程序有未定义的行为,就像你已经做的一样。

代码语言:javascript
运行
复制
std::vector<uint8_t> * optvec{ nullptr };
optvec->reserve(1);

为什么你想要一个可选的向量呢?一个向量已经可以包含零个元素。

有没有其他方法可以做到这一点?

有一个(可能为空的)普通向量。

代码语言:javascript
运行
复制
std::vector<uint8_t> optvec;
票数 4
EN

Stack Overflow用户

发布于 2021-07-14 17:47:36

您的optional不包含任何向量。optional的默认构造函数将其构建为不包含任何值的对象。

您可以简单地

代码语言:javascript
运行
复制
std::optional<std::vector<uint8_t>> optvec = std::vector<uint8_t>();

或者..。

代码语言:javascript
运行
复制
std::optional<std::vector<uint8_t>> optvec;
optvec.emplace();

然后在你的optional中有一个实际的向量

票数 2
EN

Stack Overflow用户

发布于 2021-07-14 18:08:39

有没有其他方法可以做到这一点?

是,为optional赋值

代码语言:javascript
运行
复制
int main()
{
  std::optional<std::vector<uint8_t>> optvec;
  assert(!optvec.has_value());

  optvec = { 'a', 'b', 'c' };
  assert(optvec.has_value());

  optvec.value().emplace_back('d');
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68375672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档