gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:04:40 26 4
gpt4 key购买 nike

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

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

std::vector<double>* GetBins(void);

在方法中,分配一个新的 std::vector,我用数据填充它。我正在返回一个指向这个的指针。

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,则移动语义将确保不会执行任何复制。

关于c++ - 返回 std::vector - 正确的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16106290/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com