vector erase原型
// erase的函数原型有两种形式
iterator erase(iterator p); // 删除某个迭代器p所指元素元素,返回被删元素之后元素迭代器。当p=end,函数行为无定义。
iterator erase(iterator b, iterator e); // 或者迭代器范围[b, e)的元素
在使用中需要注意到删除元素后迭代器的数量和位置的变化;
在进行多值删除时,如果是按值匹配删除,应将迭代器更新放在循环内部,如果是按下标删除,则应从后向前删除,避免段错误。
删除普通元素
// 按值匹配删除,迭代器更新放在循环体内,而不是for循环条件语句中
for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); )
{
if(*iter == 3)
{
iter = veci.erase(iter);
}
else
{
iter++;
}
}
// 按下标删除多个元素,从后向前,避免段错误
// value_vec 元素向量
// idx_vec 待删除元素索引向量,按升序排列
for(int i = idx_vec.size()-1; i >= 0; i--)
{
value_vec.erase(value_vec.begin() + idx_vec[i]);
}
删除指针元素
当vector存储的是对象的指针时,此时vector用erase删除元素时,那么元素本身在该vector种会被删除,但对象本身没有被实际删除…
因此,针对这种情况new处理的对象,如果想把指针对应的对象实例也删除,需要先遍历删除对象实例后,再删除指针元素。
// std::vector中存放的元素为new出来的对象指针 Furniture* furniture = new Furniture();
// 删除实现功能,按待删除的元素索引列表(升序排列),删除vector中的指针元素,以及所对应的实例。
void removeFurniturebyIdxVec(const std::vector<int> furnitures_idx)
{
std::vector<Furniture*>::iterator iter;
for(int j = 0; j < furnitures_idx.size(); j++)
{
iter = this->furnitures.begin() + furnitures_idx[j];
delete (*iter);
(*iter) = nullptr;
}
for(int j = furnitures_idx.size()-1; j >=0; j--)
{
this->furnitures.erase(this->furnitures.begin() + furnitures_idx[j]);
}
}
remove与erase混合使用
// remove的函数原型
// remove函数会将范围内值等于val的元素用后一个元素替代,返回新的end()迭代器,但是不改变原来数组的end()迭代器的值
iterator remove(iterator first, iterator last,val); // 返回值为新的end()迭代器
// 通常和erase()函数混合使用
// remove()函数的功能就是将vector中存在的指定数据移动到vector末尾,注意,虽说remove将元素移动到末尾,但是在vector中并不显示出来,也就是说不能输出,但是内存中却存在这个数,是有使用了erase才能彻底删除;
vec.erase(remove(vec.begin(), vec.end(), val),vec.end());