我需要存储一堆排序的结构。在向量中执行此操作的最佳方法是什么?我应该为此使用指针还是复制?
struct myStruct {
int i;
string str;
//whatever...
};
接着:
vector<myStruct> v;
或者
vector<myStruct*> v;
提前致谢。
存储原始指针
vector<myStruct*> v;
是个坏主意。谁应该删除它们?使用智能指针更安全,例如在 C++11 中
vector<std::shared_ptr<myStruct>> v;
或者
vector<std::unique_ptr<myStruct>> v;
取决于你在做什么。看这里
如果您有一个简单的值类型,则更容易复制它们,即按照您的建议
vector<myStruct> v;
否则,如果你想要 OO 多态性,你会在你的集合中寻找一个指向 base 的指针。
通常将值存储在 STL 容器中是最佳实践方式,然后您无需担心内存清理等。
std::vector<myStruct> v; //#1 this is GOOD
std::vector<myStruct*> vp; //#2 this is BAD, you need to clean pointer elements by yourself
在情况 2 中,您必须自己清理动态分配的内存,例如:
std::vector<myStruct*> vp;
for(auto it = vp.begin(); it!= vp.end(); ++it)
{
delete *it; // release memory manually
// *it is the elemnt which is poiter, not iterator itself
}
只是徘徊在什么情况下使用指针应该可以。认为使用指针应该尽量减少内存使用。
当您需要保持多态性时,例如myStruct
用作接口目的,您可以将其作为指针存储在 STL 容器中。
#include <memory>
#include <vector>
struct myStruct
{
virtual ~myStruct() {};
};
struct Derived : public myStruct
{
};
std::vector<std::unique_ptr<myStruct>> v;
v.push_back(std::unique_ptr<myStruct>(new myStruct)); // pointer points to base object
v.push_back(std::unique_ptr<myStruct>(new Derived)); // pointer points to derived object
这取决于您的向量是否会实例化这些结构。如果是前者,那么您根本没有任何理由存储指针。如果您将实际值存储在其他地方,指针会很有帮助,但需要将指向这些值的指针收集在一个地方。