我需要存储一堆排序的结构。在向量中执行此操作的最佳方法是什么?我应该使用指针还是制作副本?
struct myStruct {
int i;
string str;
//whatever...
};
然后:
vector<myStruct> v;
或
vector<myStruct*> v;
先谢谢。
答案 0 :(得分:4)
存储原始指针
vector<myStruct*> v;
是一个坏主意。谁应该删除它们? 使用智能指针更安全,例如在C ++ 11中
vector<std::shared_ptr<myStruct>> v;
或
vector<std::unique_ptr<myStruct>> v;
取决于你在做什么。见here
如果你有一个简单的值类型,就像你建议的那样复制它们更容易
vector<myStruct> v;
否则,如果你想要OO多态性,你会在集合中找到指向base的指针。
答案 1 :(得分:1)
这取决于你的矢量是否会实例化这些结构。如果是前者,你根本没有理由存储指针。如果您将实际值存储在其他位置,指针很有用,但需要在一个地方收集指向这些值的指针。
答案 2 :(得分:1)
通常在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