设为首页
收藏本站
开启辅助访问
全部
问与答
创意
技术
酷工作
生活
交易
资源
节点
飞墙
Follow
明白贴
报酬
工算小助手
登录
注册
飞社-令人惊奇的创意工作者社区-
›
首页
›
C++
›
求教个 C++ Get 函数怎么写的问题
FSHEX=FIND+SHARE+EXPRESS
飞社-令人惊奇的创意工作者社区- 是一个关于发现分享表达的地方
现在登录
没有账号?
立即注册
推荐主题
›
没想明白,现在小朋友学新技术起手式是在 B
›
元宝开始撒钱了,大家捡个午饭钱吧
›
飞牛 NAS 的信任危机, 0Day 漏洞导致用户
›
昨天在 reddit 上发了个开源插件介绍,被骂
›
小红书怎么找到一个曾经聊过天的账号?
今日热议主题
按 Ctrl 好累?我不是一个人吧
微博能更改邮箱登录名的绑定邮箱么
[调研] Trae 的体验现在怎么样 ?
分享一个在线的 Markdown 转 PDF 工具: Ma
[日本招聘] 后端/全栈/AI/移动端 工程师 |
打包出中兴路由器, be7200p+和 be5100p+
分享一个通过大小双模型实现 Claude Code
Windows 上 VScode 启用 Claude code 插件
[Bug Report] 庐山 Map fshex026 严重渲染
[分享] 纯原生 JS/CSS 写了一个「赛博朋克
显示全部
|
最新评论
15 条回复
·
559 次点击
11#
nevermoreluo
小成
2024-8-8 10:35:49
写了一堆又删掉了,再次看到这个帖子还是忍不住想说点什么
以下仅个人观点
Student Get(const std::string& key) { return this->map_[key]; } 抛开内存效率不谈这个接口都不好
我最开始也觉得为什么不跟 py 一样直接返回对象呢,其实是因为 map_[key]这个用法和异常处理不一样。
map_[key]这个操作会在 key 不存在时构造一个,而 py 会返回 KeyError 。
那么既然报错了你就要处理,所以 py 这里的 KeyError 的异常其实隐式表达了 Status 中 NotFound 的概念。
另外我个人觉得这个不存在时构造一个是个定时炸弹,不要在拉屎后盖上沙子,否则可能要在某个午后一堆人找屎
12#
jones2000
小成
2024-8-8 10:39:58
都用指针不是效率更高吗。
std::unordered_map<std::string, Student*> map_;
Student* Get(const std::string& key) { return this->map_[key]; }
13#
lovelylain
小成
2024-8-8 10:52:15
this->map_[key] 当 key 不存在时会自动插入并返回,修改了 map 不符合 Get 语义,改为
const Student* Get(const std::string& key) const;
存在返回 value 地址,不存在返回 nullptr:
1. 避免修改 map
2. 避免拷贝
14#
GeruzoniAnsasu
小成
2024-8-8 11:16:51
orz
完美体现 c++有多复杂的例子。
可以去考虑的点:
- key 用 string 接收还是 string_view 接收? 后者支持从一段 parse 后的文本中提取一段作为 key
- student 返回时要不要创建单独的生命周期?如何保证/需不需要保证返回的 student 引用(指针)一定有效
- 异常处理范式用什么? 是错误码还是 optional 还是 expected 还是抛异常
- get 接口适不适合定义为 const ? 如果 const 的话返回的对象将不可修改,如果要进行二次处理则会引入额外复制,如果不 const 的话会存在非预期地修改了原 map 的隐患,破坏 get 的语义
- 多种 get 方式适不适合作为重载实现,还是重命名成不同的 get_xxx 比较好
15#
ipwx
小成
2024-8-8 11:35:10
楼主上一个帖子里面也出现了类似的写法
const Status& status = table.Get("w1", &stu1);
这句话是错的。你应该
Status status = table.Get("w1", &stu1);
因为你真的返回的是临时对象啊,这句话执行完就没有了啊(
16#
PTLin
小成
2024-8-8 14:12:13
本质不就是错误处理,用写法二只能抛异常
1
2
/ 2 页
浏览过的版块
推广
职场话题
配件
游戏开发
返回顶部