是否可以创建指针向量?

6 c++ pointers stl vector pure-virtual

只是想知道,因为我遇到的问题,是否有可能创建一个指针向量?如果是这样,怎么样?特别是关于使用迭代器和.begin()与它,即:我如何将此向量转换为指针向量:

class c
{
     void virtual func();
};

class sc:public c
{
     void func(){cout<<"using func";}
};

sc cobj;

vector<c>cvect
cvect.push_back(cobj);
vector<c>::iterator citer

for(citer=cvect.begin();citer<cvect.end();citer++)
{
     citer->func();
}
Run Code Online (Sandbox Code Playgroud)

Log*_*ldo 17

当然.

vector<c*> cvect;
cvect.push_back(new sc);
vector<c*>::iterator citer;
for(citer=cvect.begin(); citer != cvect.end(); citer++) {
  (*citer)->func();
}
Run Code Online (Sandbox Code Playgroud)

要记住的事情:

如果你像我在我的例子中那样使用动态分配的内存,你需要自己清理

例如:

 for(...) { delete *i; }
Run Code Online (Sandbox Code Playgroud)

这可以通过使用shared_ptrs(like boost::shared_ptr)的向量来简化.不要试图使用std::auto_ptr它,它将无法工作(甚至不会编译).

另外要记住的是,你应该避免<在可能的情况下使用比较循环中的迭代器,它只适用于为随机访问迭代器建模的迭代器,这意味着你无法更改代码以使用例如a std::list.


小智 8

vector <c> cvect不是指针的向量.它是c类型的对象矢量.你想要的vector <c*> cvect.你可能想要:

cvect.push_back( new c );
Run Code Online (Sandbox Code Playgroud)

然后,给定一个迭代器,你需要这样的东西:

(*it)->func();
Run Code Online (Sandbox Code Playgroud)

当然,很可能你首先不想要一个指针矢量......