返回std :: vector - 正确的方法

Pet*_*217 8 c++ stl vector

我正在尝试创建一个将返回std :: vector的类方法,并且对于执行此操作的最佳方法有点困惑.

我使用的方法是定义以下方法:

std::vector<double>* GetBins(void);
Run Code Online (Sandbox Code Playgroud)

并在该方法中,分配一个新的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;
 }
Run Code Online (Sandbox Code Playgroud)

(_itMap是类定义的迭代器).

在我的main.cpp中,我做了以下事情:

 std::vector<double>* myBins;
 myBins = myFreq3->GetBins();
 delete myBins;
Run Code Online (Sandbox Code Playgroud)

我知道使用这种方法,除非我删除main.cpp代码中的指针,否则我将得到一个悬空指针,因此它已经有点"危险"了.从类方法返回一个新的std :: vector的最佳方法是什么?

谢谢你们Pete

mfo*_*ini 15

最好的方法是按价值返回:

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;
}
Run Code Online (Sandbox Code Playgroud)

然后你会使用这样的函数:

std::vector<double> myBins = myFreq3->GetBins();
// no need for delete!
Run Code Online (Sandbox Code Playgroud)

编译器可能会使用RVO并且不执行任何副本.如果您正在使用C++ 11,那么移动语义将确保不执行任何副本.

  • @ Pete855217请注意,如果您尝试从函数外部访问向量,则返回该示例中的const引用将触发未定义的行为.只需按答案中显示的值返回即可. (2认同)