2013-08-16 39 views
0

我需要存储一堆已分类的结构。什么是最好的方式来做矢量?我应该使用指针还是复制?存储结构向量的最佳方法

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

然后:

vector<myStruct> v; 

vector<myStruct*> v; 

在此先感谢。

+8

存储值,除非您有充足的理由不这样做。 – juanchopanza

+0

谢谢。只是徘徊在什么情况下使用指针应该没问题。认为使用指针应尽量减少内存使用量。对不起noob问题 - 新的C++ –

+1

它将如何最大限度地减少内存使用量? – HAL

回答

4

存储原始指针

vector<myStruct*> v; 

是一个坏主意。谁应该删除它们? 使用智能指针比较安全,例如在C++ 11

vector<std::shared_ptr<myStruct>> v; 

vector<std::unique_ptr<myStruct>> v; 

取决于你在做什么。见here

如果你有一个简单的值类型,很容易将它们复制,即你的建议

vector<myStruct> v; 

否则,如果你想OO多态性你会去一个指针基地的收藏。

+0

)如果它不提倡错误的智能指针而没有提及它,并且它没有明确的最佳解决方案作为最后一个,那么可能是+1,但是,这绝对不是一个-1至少 –

+1

@ChristianRau我放弃了进入一个大讨论,并为愚蠢的选项蓬勃发展我已经添加了一个链接... – doctorlove

1

这取决于你的向量是否会实例化这些结构。如果是前者,则根本没有任何理由存储指针。如果您将实际值存储在其他位置,指针会很有帮助,但需要在一个位置收集指向这些值的指针。

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 
+0

所以据我所知,我字面上不能清理指针时使用矢量 v,对吗? –

+1

这是不对的,你需要循环遍历容器并逐个删除它们 – billz

+0

好吧我现在看到了,所以没有办法一次删除它们。 case。谢谢很多 –