我需要存储一堆已分类的结构。什么是最好的方式来做矢量?我应该使用指针还是复制?存储结构向量的最佳方法
struct myStruct {
int i;
string str;
//whatever...
};
然后:
vector<myStruct> v;
或
vector<myStruct*> v;
在此先感谢。
我需要存储一堆已分类的结构。什么是最好的方式来做矢量?我应该使用指针还是复制?存储结构向量的最佳方法
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;
取决于你在做什么。见here
如果你有一个简单的值类型,很容易将它们复制,即你的建议
vector<myStruct> v;
否则,如果你想OO多态性你会去一个指针基地的收藏。
)如果它不提倡错误的智能指针而没有提及它,并且它没有明确的最佳解决方案作为最后一个,那么可能是+1,但是,这绝对不是一个-1至少 –
@ChristianRau我放弃了进入一个大讨论,并为愚蠢的选项蓬勃发展我已经添加了一个链接... – doctorlove
这取决于你的向量是否会实例化这些结构。如果是前者,则根本没有任何理由存储指针。如果您将实际值存储在其他位置,指针会很有帮助,但需要在一个位置收集指向这些值的指针。
通常店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
所以据我所知,我字面上不能清理指针时使用矢量
这是不对的,你需要循环遍历容器并逐个删除它们 – billz
好吧我现在看到了,所以没有办法一次删除它们。 case。谢谢很多 –
存储值,除非您有充足的理由不这样做。 – juanchopanza
谢谢。只是徘徊在什么情况下使用指针应该没问题。认为使用指针应尽量减少内存使用量。对不起noob问题 - 新的C++ –
它将如何最大限度地减少内存使用量? – HAL