将JavaScript函数转换为C++;

将JavaScript函数转换为C++;,javascript,c++,dynamic-programming,Javascript,C++,Dynamic Programming,我正在研究一个动态编程问题,能够编写一个Javascript解决方案: function howSum(targetSum,numbers,memo = {}){ //if the targetSum key already in hashmap,return its value if(targetSum in memo) return memo[targetSum]; if(targetSum == 0) return []; if(targetSum &l

我正在研究一个动态编程问题,能够编写一个Javascript解决方案:

function howSum(targetSum,numbers,memo = {}){
    //if the targetSum key already in hashmap,return its value
    if(targetSum in memo) return memo[targetSum]; 

    if(targetSum == 0) return [];
    if(targetSum < 0) return null;

    for(let num of numbers){
        let aWay = howSum(targetSum-num,numbers,memo);
        if(aWay !== null){
            memo[targetSum] = [...aWay,num];
            return memo[targetSum];
        }
    }

    //no way to generate the targetSum using any elements of input array
    memo[targetSum] = null;
    return null;
}
函数howSum(targetSum,numbers,memo={}){
//如果targetSum键已在hashmap中,则返回其值
if(备忘录中的目标金额)返回备忘录[目标金额];
如果(targetSum==0)返回[];
if(targetSum<0)返回null;
for(让数字的个数){
释放=howSum(targetSum num、数字、备忘录);
如果(离开!==null){
备忘录[targetSum]=[…离开,数值];
返回备忘录[目标金额];
}
}
//无法使用输入数组的任何元素生成targetSum
备注[targetSum]=空;
返回null;
}
现在我在考虑如何将其转换为CPP代码。 对于
memo
对象,我必须使用对
无序映射的引用

但是我应该如何返回
空数组
null
值,就像在基本条件中一样?我应该在插入元素时返回
数组指针
realloc
它吗?这不是一种
C
编程方式吗? 此外,我应该如何将<<代码>默认参数< /代码>传递到<代码>备忘录< /代码> C++中的无序映射?当前我已经重载了创建备忘录无序映射并通过其<代码>引用< /代码>的功能。

任何指导都将不胜感激,因为我可以解决未来的问题。

以下是我的看法:

#include <optional>
#include <vector>
#include <unordered_map>

using Nums = std::vector<int>;
using OptNums = std::optional<Nums>;

namespace detail {

using Memo = std::unordered_map<int, OptNum>>;

OptNums const & howSum(int targetSum, Nums const & numbers, Memo & memo) {
    if (auto iter = memo.find(targetSum); iter != memo.end()) {
        return iter->second; // elements are std::pair<int, OptNums>
    }
    auto & cached = memo[targetSum]; // create an empty optional in the map

    if (targetSum == 0) {
        cached.emplace(); // create an empty Nums in the optional
    }
    else if (targetSum > 0) {
        for (int num : numbers) {
            if (auto const & aWay = howSum(targetSum-num, numbers, memo)) {
                cached = aWay;           // copy vector into optional
                cached->push_back(num); 
            }
        }
    }
    return cached;
}
} // detail

std::optional<Nums> howSum(int targetSum, Nums const & numbers) {
    detail::Memo memo;
    return detail::howSum(targetSum, numbers, memo);
}
下面是一个充实的示例,用几个测试用例来说明它的工作原理。

C++17及更高版本通常具有适用于此类情况的
std::optional
std::variant
模板。但是C++不是JavaScript。查看这个整体逻辑:在C++中,这种返回<代码> null <代码>的情况很可能通过抛出异常来指示致命错误。您不能真正将JavaScript翻译成C++,或者任何语言到任何其他语言,因为,一次尝试一行。这总是以眼泪结束。正确的方法是分析现有代码的功能,并用新语言重新实现其整体逻辑。好的,感谢您的洞察力。那么我应该继续更改代码的逻辑吗?比如返回空数组和null?我相信我很清楚地指出这不是正确的方法。正确的方法是分析所显示的代码,逻辑上,然后在C++中实现功能上等价于逻辑的东西。在C++ >代码> null < /Cord>常数中,只有指针类型有效,C++函数不能返回数组。C++不这样工作。因此,您需要为这些概念找到一些其他的替换,作为C++代码,这是您需要做出的决定,因为只有您知道如何使用替换代码。您可以返回一个BoOL来表示成功,例如谢谢。