8

我正在尝试创建一个将返回 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 的最佳方法是什么?

谢谢大家皮特

4

3 回答 3

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

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

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

编译器可能会使用RVO并且不执行任何复制。如果您使用的是 C++11,则移动语义将确保不执行任何复制。

于 2013-04-19T13:54:56.667 回答
4

按值返回

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;
 }
于 2013-04-19T13:57:43.673 回答
4

如果你想避免复制/悬空指针/...,另一种方法是简单地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);
于 2013-04-19T14:18:28.160 回答