在下面的代码块中,我想重构,所以我返回一个三向指向一个双向量的数组。我有点困惑是最好的方法。
如果错误被击中,我也希望从调用函数中轻松检测到它。
我是否需要将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;
}
}
答案 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
是可选的,但您返回的内容听起来好像没有被修改。