返回std::right方法
Returning a std::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的最好方法是什么?
谢谢皮特
最好的方法是按值返回:
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);
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 键入擦除成员函数指针的"right"方法是什么?
- 是否有任何方法可用于更改 MFC(C++) 中 CListBox 的属性"right align text"?
- "Right" C++ 中从大端二进制文件中检索 int 的方法
- 在 c++11 中,迭代向量的最现代、最"right"的方法是什么
- 返回std::right方法
- 在 std::中使用 GUID 作为键的"right"方法是什么hash_map
- 读取带有C++流的文件"right"方法是什么?
- 在C++中避免别名(例如,将容器的元素添加到自身时)的"right"方法是什么?