如果键不存在,为什么 std::map operator[] 创建一个对象?

2024-01-27

我很确定我已经在某处看到过这个问题(comp.lang.c++?谷歌似乎也没有在那里找到它),但是在这里快速搜索似乎没有找到它,所以这里是:

为什么std::map operator[]如果键不存在,则创建一个对象?我不知道,但对我来说,如果与大多数其他运算符[](如 std::vector)进行比较,这似乎是违反直觉的,如果使用它,则必须确保索引存在。我想知道实施这种行为的理由是什么std::map。就像我说的那样,当使用无效密钥访问时,更像向量中的索引和崩溃(我猜是未定义的行为)会更直观吗?

我收到的很多答案基本上都是“很便宜,为什么不呢?”或类似的。我完全同意这一点,但为什么不为此使用专用函数(我认为其中一条评论说在 Java 中没有operator[]该函数被称为put)?我的观点是为什么不map operator[]像向量一样工作?如果我使用operator[]在向量上超出范围的索引上我不希望它插入元素即使它很便宜因为这可能意味着我的代码中有错误。我的观点是为什么它与地图不一样。我的意思是,对我来说,使用operator[]在地图上意味着:我知道这个键已经存在(无论出于何种原因,我只是插入它,我在某处有冗余,无论如何)。我认为这样会更直观。

这就是说,使用运算符 [] 执行当前行为的优点是什么(仅此而已,我同意应该存在具有当前行为的函数,而不是operator[])?也许这样可以提供更清晰的代码?我不知道。

另一个答案是它已经存在了,所以为什么不保留它,但是,也许当他们(stl之前的人)选择以这种方式实现它时,他们发现它提供了优势或其他什么?所以我的问题基本上是:为什么选择以这种方式实现它,这意味着与其他方法有点缺乏一致性operator[]。它有什么好处?


Because operator[]返回对值本身的引用,因此指示问题的唯一方法是引发异常(一般来说,STL 很少引发异常)。

如果您不喜欢这种行为,您可以使用map::find反而。它返回一个迭代器而不是值。这允许它在找不到值时返回一个特殊的迭代器(它返回map::end)但还需要您取消引用迭代器才能获取该值。

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

如果键不存在,为什么 std::map operator[] 创建一个对象? 的相关文章

  • 无法将 std::min 传递给函数,std::min 的副本有效

    Passing std min函数无法编译 我复制了 libcpp 声明std min进入我的源文件并且它可以工作 std 版本有什么问题 clang 和 gcc 也会发生同样的情况 在 Godbolt 上测试 https godbolt
  • 进程退出后 POSIX 名称信号量不会释放

    我正在尝试使用 POSIX 命名信号量进行跨进程同步 我注意到进程死亡或退出后 信号量仍然被系统打开 在进程 打开它 死亡或退出后是否有办法使其关闭 释放 早期的讨论在这里 当将信号量递减至零的进程崩溃时 如何恢复信号量 https sta
  • 将 OpenCV Mat 转换为数组(可能是 NSArray)

    我的 C C 技能很生疏 OpenCV 的文档也相当晦涩难懂 有没有办法获得cv Mat data属性转换为数组 NSArray 我想将其序列化为 JSON 我知道我可以使用 FileStorage 实用程序转换为 YAML XML 但这不
  • C++ 将联合强制转换为其成员类型之一

    以下对我来说似乎完全符合逻辑 但不是有效的 C 联合不能隐式转换为其成员类型之一 有人知道为什么不这样做的充分理由吗 union u int i char c function f int i int main u v v i 6 f v
  • 将日期时间转换为指定格式

    我有这个日期格式yy MM dd HH mm ss ex 12 02 21 10 56 09 问题是 当我尝试使用以下代码将其转换为不同格式时 CDate 12 02 21 10 56 09 ToString MMM dd yyyy HH
  • 有什么方法可以重载 C# 中的扩展方法吗?

    我有以下模型模式 public abstract class PARENTCLASS public class CHILD A CLASS PARENTCLASS public static class EXTENSION public s
  • 你好,我最近正在开发我的新游戏,我遇到了*无限跳跃*的问题

    所以基本上当我按跳跃 空格键时我会跳跃但是如果我连续按空格键它 只是跳啊跳啊跳等等 我不想要我只想它跳一次 code if Input GetKeyDown space isGrounded velocity y Mathf Sqrt ju
  • 通过 C# Mailkit / Mimekit 发送电子邮件,但出现服务器证书错误

    Visual Studio 2015 中的 0 代码 1 我正在使用 Mailkit 最新版本 1 18 1 1 从我自己的电子邮件服务器发送电子邮件 2 电子邮件服务器具有不受信任的自签名证书 3 我在代码中添加了以下两行 以忽略服务器证
  • 如何使用递归查找数字中的最小元素 [C]

    好的 所以我正在准备我的 C 考试 当谈到递归时我有点卡住了我是大学一年级的学生 这对我来说似乎有点困难 练习要求在给定的数字中使用递归函数我需要找到最小的元素 例如 52873 是 2 程序需要打印 2 include
  • 如何在 C# 中获取 Json 数组?

    我有一个像这样的 Json 字符串 我想将它加载到 C 数组中 当我尝试这样做时 我收到异常 我的字符串 customerInformation customerId 123 CustomerName Age 39 Gender Male
  • 为什么 f(i = -1, i = -1) 是未定义的行为?

    我正在读关于违反评估顺序 http en cppreference com w cpp language eval order 他们举了一个令我困惑的例子 1 如果标量对象上的副作用相对于同一标量对象上的另一个副作用是无序的 则行为未定义
  • 使用 xslt 将 xml 转换为 xsl-fo 时动态创建超链接?

    我想使用 xsl 文件在 PDF 报告中创建标题 如果源文件包含超链接 则应将其呈现为超链接 否则呈现为纯文本 例如 我的 xml 如下所示 a href http google com target blank This is the h
  • C 中使用 getrandom 实现随机浮点数

    我试图生成一个介于 0 和 1 之间的随机浮点数 无论是在 0 1 还是 0 1 对我来说都不重要 网上关于此的每个问题似乎都涉及rand 呼叫 播种time NULL 但我希望能够每秒多次调用我的程序 并每次都获得不同的随机数 这引导我找
  • 浮点字节序?

    我正在为实时海上模拟器编写客户端和服务器 并且由于我必须通过套接字发送大量数据 因此我使用二进制数据来最大化可以发送的数据量 我已经了解整数字节顺序以及如何使用htonl and ntohl为了规避字节顺序问题 但我的应用程序与几乎所有模拟
  • 如何在dll级别读取app.config? [复制]

    这个问题在这里已经有答案了 我在一个解决方案中有一个控制台应用程序项目和库项目 dll The 图书馆项目有 app config 文件 我在其中存储我在库中使用的一些键值对 控制台应用程序引用此 dll 我有另一个 app config
  • 有没有办法直接在函数参数中格式化字符串而不是使用临时字符串?

    我有一个接受字符串 字符数组 作为参数的函数 void enterString char my string 当使用这个函数时 我经常发现自己想要输入格式化的字符串 我使用 sprintf 来做到这一点 然而 我每次都必须创建一个临时字符串
  • 如何将 int 作为“void *”传递给线程启动函数?

    我最初有一个用于斐波那契变量数组的全局变量 但发现这是不允许的 我需要进行基本的多线程处理并处理竞争条件 但我无法在 pthread 创建中将 int 作为 void 参数提供 我尝试过使用常量指针 但没有成功 由于某些奇怪的原因 void
  • 如果“嵌入式”SQL 2008 数据库文件不存在,如何创建它?

    我使用 C ADO Net 和在 Server Management Studio 中创建的嵌入式 MS SQL 2008 数据库文件 附加到 MS SQL 2008 Express 创建了一个数据库应用程序 有人可以向我指出一个资源 该资
  • 如何提高环复杂度?

    对于具有大量决策语句 包括 if while for 语句 的方法 循环复杂度会很高 那么我们该如何改进呢 我正在处理一个大项目 我应该减少 CC gt 10 的方法的 CC 并且有很多方法都存在这个问题 下面我将列出一些例如我遇到的问题的
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost

随机推荐

  • 单个 PDO 查询意外达到 PHP 内存限制?

    我有一个非常简单的查询 如下所示 result pdo gt query SELECT FROM my table foreach result as r do some stuff 但是当我运行这个时 我收到以下错误 致命错误 第 15
  • 如何用Javascript让Javascript运行在页面的最后一个进程

    我遇到了一个麻烦 当页面加载时 我的 Javascript 会运行 并且 JS 日历会在我的 JS 之后加载 因此 我的 JS 不会影响 JS 日历 1 页面加载 2 我的JS运行 3 这里放一些东西 其他JS 4 JS日历启动 我在这里想
  • 将自定义验证规则添加到 Sonata User Bundle

    我已经根据文档安装了 SonataUserBundle 一切正常 除了我无法添加自定义验证规则 我的理解是 新规则应该添加到新的验证组中 然后更新 config yml 以告诉 SonataUserBundle 或 FosUserBundl
  • android中如何保持会话?

    谁能告诉我如何维护用户登录的会话 例如 当用户登录应用程序时 除非用户注销或卸载类似于 Android 中的 gmail 的应用程序 否则他们必须登录 为您开设一堂课SharedPreferences public class Sessio
  • 不区分大小写的令牌匹配

    是否可以将语法设置为不区分大小写匹配 例如一条规则 checkName CHECK Word 会匹配check name也CHECK name 的创造者PEGKit https github com itod pegkit here 当前执
  • Perl 中的 Web 服务客户端

    我是客户端 我希望调用 Web 服务的方法 我有一个 Web 服务地址 svc 后缀 并且有该方法的名称 返回值及其参数 该服务是通过 WCF HTML 端点 实现的 我希望通过以下方式调用这些方法SOAP Lite 我应该为 URI 代理
  • Facebook Connect“下一个”错误

    我正在尝试使用新的 Facebook 身份验证系统 但无法登录 我收到以下错误消息 API错误代码 100 API错误描述 无效参数 错误消息 next 不属于应用程序 发送到 Facebook 的网址是 请注意 网址中的 Next 变量是
  • 在一个查询中获取多个表

    一小时内发了三十个帖子 所以我很抱歉 但我没有得到我想要的 我会尝试解释更多 我有两张桌子 帖子 我想在这一页中显示所有帖子和评论 购买 1 条查询 我在帖子表中 100 个帖子 我在评论表中有 20条评论 我试试这个代码 qq mysql
  • 当我在拒绝后重新提交应用程序时,是否需要增加版本号? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的应用程序被拒绝了 所以我已修改它并准备重新提交 我第一次提交的时候是1 0版本 这次重新提交是否需要增加版本号 不 您不需要更新版本号
  • C++ 主控/工人

    我正在寻找跨平台 C master worker 库或工作队列库 总体思路是 我的应用程序将创建某种任务或工作对象 将它们传递给工作主机或工作队列 后者又会在单独的线程或进程中执行工作 为了提供一些上下文 该应用程序是一个 CD 抓取器 我
  • sklearn MinMaxScaler() 与 groupby pandas

    我有两个特点rank and ratings不同日期从电子商务网站抓取的不同类别下的不同产品 ID 此处提供示例数据框 import pandas as pd import numpy as np import warnings warni
  • 使用 AVFoundation 的视频的第一帧

    我正在尝试使用 AVFoundation 中的类获取视频的第一帧 但它似乎根本没有得到图像 我的代码目前看起来像这样 AVURLAsset asset AVURLAsset URLAssetWithURL NSURL URLWithStri
  • 如何本地和远程删除 Git 分支?

    尝试删除远程分支失败 git branch d remotes origin bugfix error branch remotes origin bugfix not found git branch d origin bugfix er
  • 运行项目 net core 时出现错误 "{"state Machine":{"<>1_ state":-2,"<>t__builder":{"

    当我运行项目 netcore 时 我收到一条消息 stateMachine 1 state 1 t builder 我不知道如何解决这个问题 我在命令行中看到错误 Microsoft AspNetCore Diagnostics Devel
  • Python Pandas 将一系列字符串连接成一个字符串

    在 python pandas 中 有一个由 str 值构成的 Series dataframe 列可以组合成一个长字符串 df pd DataFrame text pd Series Hello world index a b c 目标
  • 具有布尔字段默认初始化的结构?

    我有以下用例 一个带有一些布尔值和 int 变量的结构 struct a int field1 bool field2 bool field3 我正在重构这段代码 并为 struct 编写一个构造函数 问题是字段的默认初始化 我并不是在这里
  • 如何使用 jQuery 查询 neo4j 图

    随着我的尝试 早期版本已更新 我确实知道一些 javascript 并且我有一个可用的 neo4j 数据库 我可以在控制台中使用 cypher 进行查询 另外 这个卷曲也有效 卷曲 X POST http localhost 7474 db
  • 以星号 * 开头的 Perl 标识符代表什么?

    我有这个子例程 其标识符定义如下 VALID NAME REG EX a zA Z0 9 MACRO VALID NAME MACRO VALID NAME 我进一步查看了该文件 它们被引用为 MACRO VALID NAME 我猜它是用字
  • TreeView 和实体框架绑定

    我是 WPF 和 EF 的新手 我看过但找不到适当的帮助 这就是我所拥有的 实体框架 报告定义 ParentID and 报告定义 SectionID are 节 id节 报告定义示例 and 部分示例 这就是我想介绍的内容 TreeVie
  • 如果键不存在,为什么 std::map operator[] 创建一个对象?

    我很确定我已经在某处看到过这个问题 comp lang c 谷歌似乎也没有在那里找到它 但是在这里快速搜索似乎没有找到它 所以这里是 为什么std map operator 如果键不存在 则创建一个对象 我不知道 但对我来说 如果与大多数其