- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我得到了 this example关于在 C++ 中实现通用内存。然而,正如有人在此评论中指出的那样,原始代码进行了 2 次查找,而下面的代码只进行了一次查找。
template <typename ReturnType, typename... Args>
std::function<ReturnType (Args...)> memoize(std::function<ReturnType (Args...)> func)
{
std::map<std::tuple<Args...>, ReturnType> cache;
return ([=](Args... args) mutable {
std::tuple<Args...> t(args...);
auto range = cache.equal_range(t);
if (range.first != range.second) return (*range.first).second;
return (*cache.insert(range.first, func(args...))).second;
});
}
有人注意到使用 unordered_map 可能会有更好的性能。但是我有read那:
they are generally less efficient for range iteration through a subset of their elements. I don't understand why the range operation are less efficient, and if the case above is one of these cases (since we use range)?
最佳答案
as someone made notice in this comment, the original code makes 2 lookups, while the code below makes only one
好的,所以您正在尝试使用提示的 insert
以避免对插入点进行冗余的对数复杂度搜索。您仍然有与另一个问题相同的错误,您的代码可能如下所示:
cache.insert(range.first, std::make_pair(t, func(args...)));
// ^hint ^value_type
(这是链接文档中的重载 #4)。
您完全可以不进行第一次查找:insert
如果键存在,则简单地将迭代器返回到现有元素,因此您可以使用乐观插入来编写它 - 这是否更好取决于默认构造的成本,然后分配您的 ReturnType:
auto result = cache.insert(make_pair(t, ReturnType{}));
if (result.second) {
// insertion succeeded so the value wasn't cached already
result.first->second = func(args...);
}
return result.first->second;
... using unordered_map would have probably better performance ...
std::map
查找/插入具有对数复杂度的刻度,以及 std::unordered_map
以恒定的复杂性扩展。实际上哪个更好取决于您有多少条目,以及其他因素,您需要分析才能确定。
... [unordered_map is] less efficient for range iteration ...
嗯,如果你避免equal_range
,你根本不需要范围迭代.
查看您实际使用的操作,并了解哪种数据结构最适合。对于简单的查找和插入,这是您真正需要的,unordered_map
可能没问题。 std::map
如果您关心键的相对顺序(而您并不关心),那就更好了。
两种结构对key也有不同的要求:map
需要排序( operator<
或自定义比较器),而 unordered_map
需要一个明确定义的散列函数和 operator==
或自定义谓词。
首先,我不确定std::hash
支持std::tuple
,因此您可能需要提供自定义哈希器才能使用 unordered_map
.
关于c++ - unordered_map : why range operation are inefficient, 是这种情况吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36597697/
我创建了以下 sub 来简单地说明问题。我将事件工作表的范围 A2:E10 分配给范围变量。然后,对于另一个范围变量,我将这个范围的子范围,单元格 (1, 1) 分配给 (3, 3)。 我原以为这将包
我使用正则表达式来搜索以下属性返回的纯文本: namespace Microsoft.Office.Interop.Word { public class Range {
我正在开发一个宏来突出显示某些行/单元格以供进一步审查。一些值/空白将以红色突出显示,其他以橙色突出显示,而整行应为黄色。我从上一个问题中得到了一些帮助,并添加了更多细节,它工作得几乎完美,但我被困在
这个问题在这里已经有了答案: What is the difference between range and xrange functions in Python 2.X? (28 个答案) 关闭
我在尝试运行脚本时遇到这个奇怪的错误,代码似乎是正确的,但似乎 python (3) 不喜欢这部分: def function(x): if int
我正在编写一种算法,将一些数据写入提供的输出范围(问题的初始文本包括具体细节,这将评论中的讨论转向了错误的方向)。我希望它在 API 中尽可能接近标准库中的其他范围算法。 我查看了 std::rang
这按预期工作: #include #include int main() { auto chunklist = ranges::views::ints(1, 13) | ranges::vie
我这里有一个字符串,我正在尝试对其进行子字符串化。 let desc = "Hello world. Hello World." var stringRange = 1..' 的值转换为预期的参数类型
我有一个高级搜索功能,可以根据日期和时间查询记录。我想返回日期时间范围内的所有记录,然后从该范围内返回我想将结果缩小到一个小时范围(例如 2012 年 5 月 1 日 - 2012 年 5 月 7 日
Go 中的 range 函数和 range 关键字有什么区别? func main(){ s := []int{10, 20, 30, 40, 50, 60, 70, 80, 90}
如果我有一个范围,如何将其拆分为一系列连续的子范围,其中指定了子范围(存储桶)的数量?如果没有足够的元素,则应省略空桶。 例如: splitRange(1 to 6, 3) == Seq(Range(
我正在开发 VSTO Excel 项目,但在管理 Range 对象时遇到一些问题。 实际上,我需要知道当前选定的范围是否与我存储在列表中的另一个范围重叠。所以基本上,我有 2 个 Range 实例,我
在即将推出的 C++20 系列中,将有 range concept具有以下定义: template concept range = __RangeImpl; // exposition-only de
希望有人能回答我的问题。我在 VHDL 代码中遇到了这个命令,但不确定它到底做了什么。有人可以澄清以下内容吗? if ( element1 = (element1'range => '0')) the
可以将范围嵌套在范围中吗?使用范围内的变量?因为我想取得一些效果。为了说明这个问题,我有以下伪代码: for i in range(str(2**i) for i in range(1,2)):
我想在 2 个日期之间创建一个范围,并且我的范围字段有时间 damage_list = Damage.objects.filter(entry_date__range=(fdate, tdate))
在下面的代码中 #include #include #include int main() { std::unordered_mapm; m["1"]=1; m["2"]=2
我试图为我的电子表格做一个简单的循环,它循环遍历一个范围并检查该行是否为空,如果不是,则循环遍历一系列列并检查它们是否为空,如果是则它设置一个消息。 问题是每次它通过循环 ro.value 和 col
我在将一个工作簿范围中的值分配给当前工作簿中的某个范围时遇到问题。当我使用 Range("A1:C1") 分配我的范围时,此代码工作正常,但是当我使用 Range(Cells(1,1),Cells(1
我改写了原来的问题。 Sub s() Dim r As Range Set r = ActiveSheet.Range("B2:D5") Debug.Print r.Rows.Count
我是一名优秀的程序员,十分优秀!