返回指向嵌套std :: vector项的指针的最佳方法

时间:2013-09-04 23:01:17

标签: c++ arrays pointers

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

如果错误被击中,我也希望从调用函数中轻松检测到它。

我是否需要将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;
    }
}

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

你不能返回一个内置数组,主要是因为它们在自身时是不可复制的(内置数组在它们是某个成员时是可复制的)。最简单的方法可能是返回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是可选的,但您返回的内容听起来好像没有被修改。