1

在下面的代码块中,我想重构,所以我返回一个由三个指针组成的数组,指向一个双精度向量。作为最好的方法,我有点困惑。

如果遇到错误,我还希望它可以很容易地从调用函数中检测到。

我是否需要将 vCase var 转换为:

std::vector<double>[3] vCases
// or
double[3] vCases

还有什么正确的函数定义呢?我了解了数组的基础知识,我有一个嵌套向量的事实让我大吃一惊!

感激地收到任何帮助。

std::vector<std::vector<double> > TrainingCases::getCase(int caseNo) {
    std::vector<std::vector<double> > vCase;
    if (caseNo > vInputs.size()) {
        std::cout << "TrainingCases Error: Out of range caseNo selected. " << std::endl;
        return vCase;
    } else {
        vCase.push_back(vInputs.at(caseNo));
        vCase.push_back(vTargets.at(caseNo));
        vCase.push_back(vScoreModifiers.at(caseNo));
        return vCase;
    }
}
4

2 回答 2

2

我真的不确定我是否能得到你想要完成的事情......无论如何,以下内容肯定会起作用:

vector<vector<double>> getCase()
{
    vector<vector<double>> vCase;
    return vCase;
}

如果您想返回一个指向向量数组的指针,则可以执行以下操作:

vector<double>* getCase()
{
    vector<double>* vCase = new vector<double>[3];
    return vCase;
}

但这将是一个非常糟糕的主意,因为您必须delete[]在某处调用返回的指针以防止内存泄漏。更好的选择是写

struct CaseType
{
    vector<double> vCase[3];
};

CaseType getCase()
{
    CaseType myCase;
    return myCase;
}

关键是,您不能在函数内创建临时堆栈对象,然后返回指向它的指针,因为它将自动销毁。但是,如果您使用创建对象new,则必须在某处释放内存,并且我不会编写这样的代码(在这种情况下)。

编辑

从你的评论来看,我相信你想要这样的东西:

struct CaseType
{
    vector<double> vCase[3];
};

void getCase(CaseType& myCase)
{
    // myCase.vCase[0] = ...
    // myCase.vCase[1] = ...
    // ...
}

这样您就不必一直构造临时对象。你会这样称呼你:

CaseType myCase;
getCase(myCase);
// do stuff with myCase
于 2013-09-04T23:36:07.433 回答
2

您不能返回内置数组,主要是因为它们在自身上时不可复制(内置数组在它们是某物的成员时是可复制的)。最简单的方法可能是返回 a std::array<std::vector<double>, 3>

return std::array<std::vector<double>, 3>{ vInputs[caseNo],
                                           vTargets[caseNo],
                                           vScoreModifiers[caseNo] };

对于索引超出范围的情况,我会抛出异常。当然,如果你真的使用想要返回指针并且对象停留的时间足够长,你会使用稍微修改过的版本:

return std::array<std::vector<double> const*, 3>{ &vInputs[caseNo],
                                                  &vTargets[caseNo],
                                                  &vScoreModifiers[caseNo] };

const是可选的,但您返回的内容听起来好像它们没有被修改。

于 2013-09-04T23:44:31.260 回答