C++ Map 使用非默认构造函数初始化对象

2024-01-17

在 C++ 中,假设我有一个无序映射定义如下:

unordered_map<int, MyClass> my_map;
auto my_class = my_map[1];

在上面的代码中,如果 my_map 中不存在 1 作为键,它将使用默认构造函数初始化 MyClass 并返回。但是有没有办法使用MyClass的非默认构造函数进行初始化呢?


你说得对operator[]需要值类型是可默认构造的。

insert https://en.cppreference.com/w/cpp/container/unordered_map/insert才不是:

std::unordered_map<int, MyClass> my_map;
// Populate the map here

// Get element with key "1", creating a new one
// from the given value if it doesn't already exist
auto result = my_map.insert({1, <your value here>});

这为您提供了一个对,其中包含元素的迭代器(无论是新创建的还是已经存在的)和布尔值(告诉您是哪种情况)。

So:

auto& my_class = *result.first;
const bool was_inserted = result.second;

现在您可以利用这些信息做任何您想做的事情。很多时候你甚至不会关心result.second并且可以忽略它。

对于更复杂的值类型,您可以使用emplace,就像insert但是,嗯,更好。假设您确实不希望在不使用该值的情况下构造该值,并且您有 C++17:

auto result = my_map.try_emplace(1, <your value's ctor args here here>);

如果你不在乎(或者没有 C++17):

auto result = my_map.emplace(1, <your value>);

这还是比insert因为它可以将值移动到映射中,而不是复制它。

最终,如果你甚至不想产生不必要的 ctor args,你总是可以做一个find首先,但最好尽量避免这种情况,因为插入操作本身也会进行查找。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ Map 使用非默认构造函数初始化对象 的相关文章

随机推荐

  • 在 IE9 和 Firefox 中具有全屏模式的 HTML5 视频

    我目前正在开发 HTML5 视频插件 下面是我的代码并尝试使用自定义控件 问题是我有一个全屏按钮 当我单击它时 视频需要将其更改为全屏模式 我可以在 chrome 中使用它 但不能在 IE 和 Firefox 中使用 function ad
  • 如何在打字稿中实现对象值的联合类型

    const obj a 122 b 456 c 123 Keys a b c type Keys keyof typeof obj Values string number type Values typeof obj Keys const
  • C# 中的日期时间添加天数

    我想在某个日期中添加天数 我有这样的代码 DateTime endDate Convert ToDateTime this txtStartDate Text Int64 addedDays Convert ToInt64 txtDaysS
  • Intellij 浏览多个 Maven 项目

    所以我有一个如下所示的文件结构 git project classpath app1 pom xml classpath project src app2 pom xml classpath project src app3 pom xml
  • 在 Spring MVC 中以编程方式设置资源路径

    我的 MVC 应用程序需要访问 servlet 上下文之外的缩略图和视频文件 所以我将 servlet context xml 设置为具有以下内容
  • 无法使用 kubectl 创建文件

    我最近开始从事微服务工作 我正在构建我的 docker 映像并希望将其部署在 kubernetes 上 创建 pod yaml 文件时 我开始收到以下错误 命令 kubectl create f podservice yaml Error
  • 跨区域调用 AWS lambda

    我有三个 lambda 函数 boss worker1 worker2 当使用 boto3 client invoke 时 我可以从老板那里调用worker1 这两个是在同一个地区的 worker2 位于单独的区域 当尝试从 boss 调用
  • 清除任务中的所有活动?

    我有一个启动屏幕活动 然后是一个登录活动 我的历史堆栈如下所示 SplashActivity LoginActivity 当用户通过 LoginActivity 成功登录时 我想启动 WelcomeActivity 但清除整个堆栈 Spla
  • 如何避免页面对象中的复合类名称错误?

    当我尝试使用有空格的类名时class country name 在页面对象中 我得到 Compound class names not permitted Selenium WebDriver Error UnknownError 如何使用
  • React Router 传递参数。如何?

    具有以下 React Router const AppRoutes
  • Autofac 已下载,我可以访问构建器方法,但不能访问 RegisterControllers 方法

    下面的代码是我到目前为止所拥有的 RegisterControllers 方法不存在 尽管我可以在 autofac 文档以及其他堆栈溢出问题上看到它 Visual Studio 一直说 ContainerBuilder 不包含 Regist
  • 使用 TypeFamilies 派生实例

    我有一个类型类Foo具有关联类型 LANGUAGE TypeFamilies class Foo a where type Bar a foo a gt Bar a 现在我想定义一个包含关联类型之一的数据类型 并派生一个Show它的实例 d
  • HTML与大虾

    我尝试使用 prawn 生成日志条目的 PDF 然后条目存储在 bbcode b bold b 等 中并转换为 html 显示 大虾有什么办法可以显示html吗 这听起来像虾格式 http github com sandal prawn f
  • WordPress 页面重定向到主页

    我有一个 WordPress 网站http www wjewel com http www wjewel com 网站的所有页面都被重定向到主页 没有用于重定向的 htaccess 文件或 web config 文件 有人可以指导我这个问题
  • 如何重复更新android TextView来模拟动画

    我希望一旦按下菜单中的按钮 TextView 中的文本就会不断变化 这是我的菜单的 onOptionsItemSelected public boolean onOptionsItemSelected MenuItem item switc
  • pip3安装pyautogui,错误代码1

    我无法安装 pyautogui 我已经尝试了一切 例如 pip3 install pillow 也按照网站上的步骤操作pyautogui 网站 http pyautogui readthedocs io en latest install
  • 配置 Redis 以与 AppHarbor 良好配合

    我使用 AppHarbor 作为 CI 环境来验证我的提交 我在 AppHarbor 中收到错误 因为 Redis 无法写入磁盘 Error RedisResponseException MISCONF Redis is configure
  • Adobe AIR 键盘挂钩

    我正在尝试向我的 AIR 应用程序添加一项功能 即使应用程序最小化 该功能也可以侦听 可配置的 全局键盘事件 例如 CTRL ALT SHIFT F12 抓取屏幕截图 我找不到任何方法来注册键盘挂钩 并且监听键盘事件仅在应用程序具有焦点时捕
  • 如何防止 iframe 页面被插入 IE 浏览历史记录中

    我在将 iframe 页面插入 IE9 的浏览历史记录时遇到很多麻烦 这很痛苦 因为您必须多次单击后退才能到达上一页 这是什么原因呢 是浏览器的bug还是页面的bug 编辑 我意识到我正在使用 javascript 来更新页面上所有 ifr
  • C++ Map 使用非默认构造函数初始化对象

    在 C 中 假设我有一个无序映射定义如下 unordered map