[英]Returning a std::vector - right approach
我正在尝试创建一个将返回std :: vector的类方法,并且对于执行此操作的最佳方法有点困惑。
我使用的方法是定义以下方法:
std::vector<double>* GetBins(void);
并在该方法中,分配一个新的std :: vector,我用数据填充。 我正在返回指向这个的指针ie。
std::vector<double>* Frequency::GetBins(void) {
std::vector<double> *rtnVec = new std::vector<double>();
for (_itMap = _mapFreq.begin(); _itMap != _mapFreq.end(); _itMap++ ) {
rtnVec->push_back((*_itMap).first);
}
return rtnVec;
}
(_itMap是类定义的迭代器)。
在我的main.cpp中,我做了以下事情:
std::vector<double>* myBins;
myBins = myFreq3->GetBins();
delete myBins;
我知道使用这种方法,除非我删除main.cpp代码中的指针,否则我将得到一个悬空指针,因此它已经有点“危险”了。 从类方法返回一个新的std :: vector的最佳方法是什么?
谢谢你们Pete
最好的方法是按价值返回:
std::vector<double> Frequency::GetBins() {
std::vector<double> rtnVec;
rtnVec.reserve(_mapFreq.size()); // reserve enough size, no reallocations
for (_itMap = _mapFreq.begin(); _itMap != _mapFreq.end(); ++_itMap ) {
rtnVec.push_back(_itMap->first);
}
return rtnVec;
}
然后你会使用这样的函数:
std::vector<double> myBins = myFreq3->GetBins();
// no need for delete!
编译器可能会使用RVO并且不执行任何副本。 如果您正在使用C ++ 11,那么移动语义将确保不执行任何副本。
按价值返回
std::vector<double> Frequency::GetBins(void) {
std::vector<double> rtnVec;
// ...
return rtnVec;
}
但是,如果您希望通过指针返回,则可以使用智能指针:
std::unique_ptr<std::vector<double>> Frequency::GetBins(void) {
std::unique_ptr<std::vector<double>> rtnVec(new std::vector<double>());
//...
return rtnVec;
}
如果你想避免复制/悬空指针/ ...,另一种方法是简单地通过引用方法传递你的std::vector
:
void Frequency::GetBins( std::vector<double>& bins ) {
for (_itMap = _mapFreq.begin(); _itMap != _mapFreq.end(); _itMap++ ) {
bins->push_back((*_itMap).first);
}
}
您只需要在之前定义它:
std::vector<double> myBins;
myFreq3->GetBins(myBins);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.