Javascript 试图从C+中的JS重新创建这段代码+;

Javascript 试图从C+中的JS重新创建这段代码+;,javascript,c++,Javascript,C++,我看过一门关于动态规划的课程,老师用JS解决了这个问题 我理解逻辑,但现在我必须用C++来写。这是他的密码: 我试图转换到C++,但是我被一些错误排除了: std::vector<int> howSum(std::vector<int> numbers, int target) { if (target == 0) return std::vector<int>(); if (target < 0) return NULL; /*thi

我看过一门关于动态规划的课程,老师用JS解决了这个问题

我理解逻辑,但现在我必须用C++来写。这是他的密码:

我试图转换到C++,但是我被一些错误排除了:

std::vector<int> howSum(std::vector<int> numbers, int target)
{
    if (target == 0) return std::vector<int>();
    if (target < 0) return NULL; /*this doesn't work here because NULL is of type int - what should I do?*/

    for (int num : numbers)
    {
        int remainder = target - num;
        std::vector<int> remainderResult = howSum(numbers, remainder);
        if (remainderResult != NULL) /*doesn't work*/
        {
            return remainderResult.push_back(num);
        }
    }

    return NULL; /*doesn't work*/
}
std::vector howSum(std::vector number,int target)
{
if(target==0)返回std::vector();
如果(target<0)返回NULL;/*这在这里不起作用,因为NULL是int类型的-我应该怎么做*/
for(整数:数字)
{
整数余数=目标数;
std::vector remainderResult=howSum(数字、余数);
如果(remainderResult!=NULL)/*不起作用*/
{
返回remainderResult.push_back(num);
}
}
返回NULL;/*不起作用*/
}
我真的不知道如何像他在JS中那样返回null并与null进行比较,我认为这是我代码的主要问题


我如何做到这一点?

< P>不像JavaScript,C++变量不能保存<代码> null < /C> >的值。code>NULL不是它的替代品-这只是编写
0
的一种奇特方式。从C++17开始,标准库有一个可空类型的模板:
std::optional
(请参阅)。它的语法部分模仿指针

另外,
push_-back()
不返回结果向量,
return
必须拆分为单独的语句

通过这些更改,您的源代码应该如下所示:

std::optional<std::vector<int>> howSum(std::vector<int> numbers, int target)
{
    if (target == 0) return std::vector<int>();
    if (target < 0) return std::nullopt; 

    for (int num : numbers)
    {
        int remainder = target - num;
        std::optional<std::vector<int>> remainderResult = howSum(numbers, remainder);
        if (remainderResult != std::nullopt) 
        {
            remainderResult->push_back(num);
            return remainderResult;
        }
    }

    return std::nullopt;
}
std::可选的howSum(std::向量数,int目标)
{
if(target==0)返回std::vector();
if(target<0)返回std::nullopt;
for(整数:数字)
{
整数余数=目标数;
std::可选余数结果=howSum(数字、余数);
if(remainderResult!=std::nullopt)
{
remainderResult->push_back(num);
返回剩余结果;
}
}
返回std::nullopt;
}

如果您的编译器至少是c++17,请将返回类型设置为
std::optional
@Eugene它不工作或者我没有正确执行-您能告诉我如何执行吗?顺便说一句,我使用的是VS2019社区。@Eugene nevermind,我将编译器更改为c++17,并且它可以工作:)thanksI并不是说
std::optional
是唯一的更改。如果它现在编译,这可能还不够。请学习std::可选。@Eugene说实话,我自己似乎不能做到。我已尝试按您所说的那样更改它,但现在我遇到另一个错误,即我无法使用.push_back()(因为我将类型更改为std::optional)。你介意在C++中从JS中写代码吗?我不知道该怎么做。在你编辑之后它就可以工作了。非常感谢您抽出时间。我将研究std::optional:)是否有任何方法可以像JS中的console.log那样显示此函数的结果?我试着这样称呼它std::难道你必须编写自己的打印循环吗?是的,我期待着,但我不知道怎么做。我意识到我需要将调用的值存储到另一个变量中,如-std::vector=howSum(nume,7).value();然后遍历它。非常感谢您的回答,它们确实帮助我学到了一些新的东西。@OctavianNiculescu您可以不用副本来完成它,只要您注意
std::optional
“layer”,因为它可能没有价值,所以您必须保持它!