返回std::right方法

Returning a std::right approach

本文关键字:方法 right 返回 std      更新时间:2023-10-16

我试图创建一个类方法,将返回一个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的最好方法是什么?

谢谢皮特

最好的方法是按值返回:

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,那么move语义将确保不执行复制。

按值返回

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);