我正在尝试为多个和任意函数创建一个通用memoizator。
对于我们想要记忆的每个函数@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_two, container, false);
}
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
TextView titolo2 = view.findViewById(R.id.quantità2);
Bundle bundle=getArguments();
int myInt = bundle.getInt("totale", 0);
titolo2.setText(String.valueOf(myInt));
}
,我们std::function<ReturnType(Args...)>
(我故意保持简单。)
当我们的memoized函数有一些非常大的参数unordered_map<Args ..., ReturnType>
时,最大的问题出现了:例如,假设我们的函数对一个包含1000万个数字的向量进行排序,然后返回已排序的向量,如{{1} }。
可以想象,在插入少于100个向量之后,我们已经填充了8 GBS的内存。请注意,这可能是由巨大的向量和排序算法所需的内存组合给出的(我没有调查原因)。
那么,如果不是上述结构,我们定义Args ...
(其中UUID =通用唯一标识符)?我们应该放松确定性特征(所以我们可能会返回错误的错误),但概率非常低。
问题是因为我从未使用过UUID,所以我不知道这个应用程序是否有合适的实现。
所以我的问题是:
std::function<vector<double>(vector<double>)>
但问题不能解决unordered_map<UUID(Args ...), ReturnType>
,所以有一个记忆结果的解决方案吗? 注意,即使在不同的运行和计算机中,为对象Args ...
生成的UUID也应该相同。
注意如果我们对两个不同的对象具有相同的UUID(因此我们返回错误的值)并且真的概率很低,那么它可以接受。 ..let说这可能是一个“概率记忆者”。
我知道这个应用程序在memoization上下文中没有意义(用户要求两次排序相同的1000万个元素向量的几率是多少?),但是时间和内存昂贵(非常适合基准测试和引入我上面提到的内存问题),所以请不要鞭打和钉死我,因为这是一个荒谬的memoization应用程序。
答案 0 :(得分:3)
识别任何对象都很容易。地址是&#34;对象标识&#34;在C ++中。这也是即使是空类也不能为零的原因。
现在,你想要的是价值等值。这完全不在语言领域。它稳固地存在于应用程序/库逻辑域中。
您应该考虑使用boost::flyweights
之类的内容。它正是这个设施,使它变得简单&#34;定制类型的等价语义。