- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当相关对象可能不存在时,创建用于从索引自定义容器中检索对象的 API 的方法有哪些?
到目前为止我想到了:
抛出异常
T get(int index) const
{
if(not_exists(index)) throw std::out_of_range("Index is out of range");
return get_base(index);
}
构造T并返回它
T get(int index) const
{
if(not_exists(index)) return T{};
return get_base(index);
}
返回 bool 并检索作为引用
bool get(int index, T & obj) const
{
if(not_exists(index)) return false;
obj = get_base(index); return true;
}
如果找不到则使用默认参数
T get(int index, T def_obj) const
{
if(not_exists(index)) return def_obj;
return get_base(index);
}
合并 4 + 2
T get(int index, T def_obj = {}) const
{
if(not_exists(index)) return def_obj;
return get_base(index);
}
修改容器以添加此类对象(警告 - get
将不再是 const
!)
T get(int index, T def_obj = {})
{
if(not_exists(index)) set(index, def_obj);
return get_base(index);
}
每种解决方案的优缺点是什么?我错过了什么吗?
我特别担心在高并发环境中进行推理,我希望为客户端提供尽可能直观和安全的 API。
最佳答案
这里的根本问题是语义:#1 和#3 是唯一可以区分存在与不存在的问题; #6 总是成功返回容器的一个元素;而其他人总是成功返回一些值。应用程序决定您需要哪些。
在这方面,#1 和#3 是完整的:任何一个都足以实现任何其他(考虑到一些其他添加元素的方法来模拟#6)。如果可以避免来自其他线程的干扰,#4 和#5 同样强大:它们可以通过提供两个不同的默认值来检测缺失。或者,可以添加 bool contains(int index) const;
以允许区分缺失(同样根据需要使用外部同步)。
但是,这些仿真(#1/3 中的#2/4/5 除外)涉及可能性能不足的重复查找。对于某些底层数据结构,可能需要其他操作才能获得最佳性能:例如,将元素从一个索引移动到另一个索引而不重建它。
同时,所有这些方法都存在实际问题,至少在一般情况下是这样。
logic_error
is always a mistake ;当然,在相当常见的情况下抛出异常是昂贵的。但是,这里可以返回一个引用,这非常有用。T
必须是值可构造的(与默认可构造的相似但不相同)。T
必须是可赋值的(并且客户端必须构造一个,可能用于多个调用)。忽略标志可能导致未定义的行为(因此将其标记为 [[nodiscard]]
)。T
对象。默认值可以是一个引用以允许引用返回(并支持检测缺失值的繁琐形式),但为了避免允许临时参数,则需要右值引用重载(或受约束的模板)。map::operator[]
)以允许改变(可能的)新元素,将会更有用。如果 T
的构建成本可能很高(即使来自 {}
),则只有 #1(由 map::at
使用)和 optional
suggestion有效率;方便地,它们也很完整。也许最快的变体是返回 const T*
,使用空指针表示不存在。在它们之间进行选择是微调性能权衡的问题(除非您的商店通常有异常(exception)或指示)。对于便宜的 T
,如果语义足够,#5 是有吸引力的;否则 #3 可能是最好的(因为它与 if(std::cin >> x)
相似)。
关于c++ - 用于从可能不存在的容器中检索对象的 API 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51056503/
这很可能是我的语法错误,因为我对在 C++ 中使用多个文件和结构(特别是将结构传递给函数)还很陌生。这是三个文件: 主要.cpp: #include #include #include #inc
我有 TypeScript NestJS 项目。 我需要验证传入的 DTO 到我的 API。它可以被描述为“创建项目”,其中我们有建筑类型(房屋、公寓、花园),并根据该类型我们需要定义: 房屋:楼层包
是否可以从可用于泛型参数的可能类型集中排除特定类型?如果是如何。 例如 Foo() : where T != bool 将意味着除了类型 bool 之外的任何类型。 编辑 为什么? 以下代码是我尝试强
我的 WebGL 体积光线转换应用程序即将完成。但是我发现了一个问题。我必须通过 2D 纹理模拟 3D 纹理。这不是问题。我正在用小切片创建一个巨大的纹理。巨大纹理的尺寸约为 4096x4096 像素
我正在处理的网页上显示了一个返回顶部按钮。当您向下滚动时,有时单击它时,它会跳到顶部,然后跳回您在页面上的位置,然后像预期的那样平滑滚动到顶部。请记住,它并不总是这样做。这只是一个滞后或故障问题还是我
我对此还很陌生,所以请耐心等待。 我有一个类,它具有三个属性:几个整数和一个用户定义对象的集合。 public class Response { public int num1 { get;
我正在制作一款平台游戏,让玩家每 30 毫秒跳跃一次,并向上添加少量的力。我想我应该使用多线程,因为我之前已经做过一些,而且看起来很简单。无论如何,我尝试了这个: public void jump()
是否可以从可能的类型集中排除特定类型,这些类型可以在泛型参数中使用?如果是这样的话。 例如 Foo() : where T != bool 表示除 bool 类型之外的任何类型。 编辑 为什么? 以下
我正在尝试在单个查询中实现内部和外部联接,我不确定我的做法是正确还是错误,因为我不太擅长查询。 就这样吧。 我有以下表格。 hrs_residentials hrs_residential_utili
关于 my website ,有一段代码可以向页面添加几个元素。这段代码不是我可以编辑的东西,而且我对它放置这些元素的位置不满意,因为它弄乱了我的一些布局。所以我想出了一个小的 jQuery 来将它们
一位客户希望我创建一个数据集,如下所示。我不知道这是否可能或合乎逻辑。 我有表parent: id name ------- ------- 1 parent1 2
这可能吗?google 好像没有这方面的资料.. 这样,如果用户在另一个网站上播放视频或歌曲,我的音量就会自动减小 最佳答案 不,这是不可能的。 如果可能的话,它必须是特定于浏览器的,但我不认为这种情
所以我正在尝试制作响应式页面。问题是为什么它归结为移动数据需要位于列表中。 我会用一些示例代码来解释 所以这可能是桌面上的输出 option1
当您将鼠标悬停在a 元素 上时,是否可以删除url? 这就是我的意思: 最佳答案 一种选择是使用一些 JavaScript。 删除 href=来自 的属性标签,取而代之的是 onclick=...
我已经考虑了几个小时,但我无法取得太大进展。它是这样的: You have an array of size n and q queries. Each query is of the form (l
我一直在尝试编写一个脚本来强化 android。我没有成功! 我正在通过模拟器运行一个 AVD,并且已经用我加载的 android shell 和 bash shell 试过了。正如您将在下面看到的那
Private Sub Workbook_Open() Dim WBname As String WBname = ThisWorkbook.name If Not InStr(WBname, "te
Spark 2.0.0-预览版 我们有一个应用程序使用了相当大的广播变量。我们在大型 EC2 实例上运行它,因此部署处于客户端模式。广播变量是一个巨大的 Map[String, Array[Strin
我正在尝试从此link中提取摘要。但是,我无法仅提取摘要的内容。到目前为止,这是我完成的工作: url <- "http://www.scielo.br/scielo.php?script=sci_a
我的主页中有一个iframe。 iframe页面中有一个modalpopup。因此,当显示modalpopup时,modalpopup的父级是iframe主体和主页父级主体。因此,覆盖层仅覆盖ifra
我是一名优秀的程序员,十分优秀!