0

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

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

接着:

vector<myStruct> v;

或者

vector<myStruct*> v;

提前致谢。

4

3 回答 3

4

存储原始指针

vector<myStruct*> v;

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

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

或者

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

取决于你在做什么。看这里

如果您有一个简单的值类型,则更容易复制它们,即按照您的建议

vector<myStruct> v;

否则,如果你想要 OO 多态性,你会在你的集合中寻找一个指向 base 的指针。

于 2013-08-16T10:51:51.560 回答
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
于 2013-08-16T10:53:15.907 回答
1

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

于 2013-08-16T10:51:21.273 回答