vector <class *>和vector <class>有什么区别?

时间:2016-02-18 00:54:01

标签: c++ templates vector std

std::vector<Class*>std::vector<Class>之间有什么区别? 而且,在效率和避免错误方面,哪一个更好用?

3 个答案:

答案 0 :(得分:3)

vector<Class*>存储一个指向对象的指针列表,对象本身必须单独分配,因为它们可以使用多态行为,如下所示:

vector<Foo*> list;
list.push_back( new Bar() ); // class Bar : Foo
list.push_back( somePointerToFoo );
list[0]->someVirtualMethod();

请注意,使用此方法,您必须像创建对象一样手动delete对象。它可能就像这样简单:

for(Foo* f : list) delete f;

...但是如果你的矢量存储了从你正在聚合的多个来源收集的指针,那么你需要确定列表&#34;是否拥有&#34;指针与否,并根据需要删除对象。

vector<Class>将实际的类值(其字段)内联存储在向量本身中,这意味着操作通常涉及复制所有值,这些值可能是也可能不是预期的行为。您始终可以创建指向这些元素的指针,但随后您将进入危险区域:

vector<Foo> list;
list.push_back( Foo() ); // construct an instance of Foo, which might be copied up to 3 times in this single operation, depending on how smart the compiler+library is
list.push_back( *somePointerToFoo ); // this will dereference and copy this instance of Foo
list[0].someVirtualMethod(); // will not be a vtable call

list.push_back( Bar() ); // forbidden, Bar does not fit into Foo

答案 1 :(得分:2)

  

vector<Class*>vector<Class>

之间有何区别?

vector<Class>存储对象,而vector<Class*>存储指向对象的指针。当您将对象推入第一种向量时,它会被复制;第二个向量存储指针,但对象保持不变。

  

而且,在提高效率和避免错误方面哪一个更好?

让我们从避免错误开始:如果可能,请使用vector<Class>,因为该类分配的任何资源都将由向量自动管理。如果vector<*Class>持有原始对象,则在完成后您将负责调用delete

由于object slicing,这可能无法在所有情况下实现,因此解决方案并非普及。

就效率而言,vector<*Class>可以避免复制,因此理论上可以更高效。即使在这种情况下,您也应该选择智能指针(如std::shared_ptr<T>std::unique_ptr<T>)到内置指针,因为智能指针可以帮助您自动化资源管理。

答案 2 :(得分:0)

嗯,std::vector<T>是一个动态可调整大小的T s。

如果TClass*,则会存储指向Class的指针(如果是Class),然后存储Class类型的对象。

一般来说,你根本不应该使用原始指针,至少不是因为拥有指针。看看智能指针。

如果你真的想要存储多态类Class或派生的对象,你必须使用指针或某种多态容器。

关于效率,它取决于Class - 移动物体的容易程度,它们的大小以及完成的频率。
换句话说,魔鬼在细节中,你没有提供这些细节。