存储结构矢量的最佳方法

时间:2013-08-16 10:41:22

标签: c++ pointers vector

我需要存储一堆排序的结构。在向量中执行此操作的最佳方法是什么?我应该使用指针还是制作副本?

struct myStruct {
    int i;
    string str;
    //whatever...
};

然后:

vector<myStruct> v;

vector<myStruct*> v;

先谢谢。

3 个答案:

答案 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