2020-07-10 11:34:14 +08:00
|
|
|
|
# vector 补充说明
|
|
|
|
|
|
|
|
|
|
## 删除指针成员
|
|
|
|
|
|
|
|
|
|
vector 经常结合对象指针来使用,例如:
|
|
|
|
|
|
|
|
|
|
```cpp
|
|
|
|
|
class ClassA{ A(){} }
|
|
|
|
|
|
|
|
|
|
vector<ClassA*> list;
|
|
|
|
|
list.push_back(new ClassA());
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
此时调用 erase() 方法后不会 delete 掉 ClassA 的对象。正确释放资源的方法如下:
|
|
|
|
|
|
|
|
|
|
```cpp
|
|
|
|
|
vector<ClassA*>::iterator itr;
|
|
|
|
|
|
|
|
|
|
for(itr=list.begin(); itr!=list.end();)
|
|
|
|
|
{
|
|
|
|
|
delete (*itr);
|
|
|
|
|
list.erase(itr);
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
这里,end() 指向最后一个元素的下一个位置;调用 delete (*itr) 释放对象;调用 erase() 后,itr 会自动 +1。因此 delete 必须在 erase() 前调用,由于 delete 后,只是析构了对象而没有修改 list 中的成员,因此可以继续调用 list.erase(itr),释放 list 中对应的成员。
|
2020-07-10 11:38:10 +08:00
|
|
|
|
|
|
|
|
|
如果是有条件的删除,则:
|
|
|
|
|
|
|
|
|
|
```cpp
|
|
|
|
|
vector<ClassA*>::iterator itr;
|
|
|
|
|
|
|
|
|
|
for(itr=list.begin(); itr!=list.end();)
|
|
|
|
|
{
|
|
|
|
|
if(...)
|
|
|
|
|
{
|
|
|
|
|
delete (*itr);
|
|
|
|
|
list.erase(itr);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
itr++;
|
|
|
|
|
}
|
|
|
|
|
```
|