当返回类型是向量容器时,是否有在 C++ 中返回 Null 的解决方法?

tbl*_*aze 3 c++ recursion c++14

问题是我正在实现一个递归,其中我必须使用NULLvalue 来指定正在遍历的递归分支无效。

NULL但在 C++ 中,当返回类型是容器(在我的例子中是向量容器)时,我们无法返回。

那么有没有解决该问题的方法,或者我是否必须使用其他逻辑?

代码:

#include<iostream>
#include<vector>


std::vector<int> howSum(int target,std::vector<int> in){
    if(target < 0 ) return {-1}; 
    if(target == 0) return {};

    for(int num : in){
        int remainder = target - num ;
        std::vector<int> remResult = howSum(remainder,in);
        if(remResult[0] != -1 || remResult.empty()){
            remResult.push_back(num);
            return remResult;
        }
    }

    return {-1};
}

int main(){

    std::vector<int> v = {2,4,3};
    int targetSum = 8;

    std::vector<int> r = howSum(targetSum,v);

    for(int o : r)
        std::cout<<o<<" ";

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

我非常感谢所有的建议和解决方案,但我想要的是一个原始的解决方案,不使用更新的 c++ 编译(即 c++17 和 c++20)。另外,如果可能的话,请查看我实现的原始解决方案,并提出一些建议(如果可以改进)。

我自己发现的替代解决方案(原始解决方案)

我写这篇文章是为了供访问此问题的人参考。

解决方案

#include<iostream>
#include<vector>
#include<string>

std::string howSum(int target,std::vector<int> v){

    if(target == 0)    return "";
    if(target < 0)     return "null";
    
    for(int num : v){
        int rem = target - num;
        std::string remRes = howSum(rem,v);
        if(remRes != "null"){
            remRes += std::to_string(num);
            remRes += " ";
            return remRes;
        }
        
    }
    return "null";
}

int main()
{
    std::vector<int> v = {2,3,4};
    int targetSum = 8;
    
    std::cout<<howSum(targetSum,v);
    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

我的动态问题解决方案

#include<iostream>
#include<vector>
#include<string>
#include<unordered_map>

std::unordered_map<int,std::string> mem;

std::string howSum(int target, std::vector<int> v){
    if(mem.find(target) != mem.end())
        return mem[target];
    if(target == 0)    return "";
    if(target < 0)     return "null";
    
    for(int num : v){
        int rem = target - num;
        std::string remRes = howSum(rem,v);
        if(remRes != "null"){
            remRes += std::to_string(num);
            remRes += " ";
            mem[target] = remRes;
            return mem[target];
        }
        
    }
    mem[target] = "null";
    return mem[target];
}

int main()
{
    std::vector<int> v = {7,14};
    int targetSum = 300;
    
    std::cout<<howSum(targetSum,v);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

小智 6

您有以下选择:

返回结果+布尔值

Return std::pair<std::vector<int>, bool>,或者更好的是像这样的结构

struct Result {
    std::vector<int> result;
    bool is_valid;
};

Result howSum(int target, const std::vector<int>& in);
Run Code Online (Sandbox Code Playgroud)

其中bool将指示结果向量是否实际上可用。

输出参数

返回bool指示操作是否成功并使用输出参数(请注意,输出参数使用非常量引用,以便可以在函数内部对其进行修饰并稍后在函数外部使用):

bool howSum(int target, const std::vector<int>& in, std::vector<int>& result);
Run Code Online (Sandbox Code Playgroud)

optional

std::optional与 C++17 或类似boost::optional库一起使用boost

std::optional<std::vector<int>> howSum(int target, const std::vector<int>& in);
Run Code Online (Sandbox Code Playgroud)

转换std::optionalbool或使用has_value方法会检查您是否返回了实际结果。

请注意,在每种情况下,最好传递输入向量const &以避免不必要的副本。