vector.erase();vector.clear();map.erase();

vector::erase() 返回被删除元素下一个位置的迭代器 iter:

STL中的源码:

复制代码
//清除[first, last)中的所有元素
iterator erase(iterator first, iterator last)
{
    iterator i = copy(last, finish, first);  //[last, finish)拷贝到first
    destroy(i, finish);
    finish = finish - (last - first);
    return first;
}
//清除某个位置上的元素
iterator erase(iterator position)
{
    if(position + 1 != end())    
        copy(position + 1, finish, position);
    --finish;
    destroy(finish);
    return position;
}
复制代码

用法:

复制代码
for(vector<int>::iterator it = vecInt.begin(); it != vecInt.end();)
{
    if(*it == 0)
    {
        it = vecInt.erase(it);
    }
    else
    {
        it++;
    }
}
复制代码

 

map::erase() 返回值为 void

(1) void erase (iterator position) { t.erase(position); }
(2) size_type erase (const key_type& x) { return t.erase(x); }
(3) void erase (iterator first, iterator last) { t.erase(first, last); }

用法:

复制代码
for(map<int,int>::iterator it = mapInt.begin(); it != mapInt.end();)
{
    if(it->second == 0)
    {
        mapInt.erase(it++);
    }
    else
    {
        it++;
    }
}
复制代码

 

vector.clear()

  vector中存储了对象的指针,调用clear后,并不会调用这些指针所指对象析构函数,因此要在clear之前调用delete;   

  如果vector存储的是对象,调用clear后,自建类型的对象(int之类的)直接删除,若是外部类型,则调用析构函数。

 

看个vector内存分配的例子:

复制代码
class Test
{
public:
    Test(int x1): x(x1) { cout << "Test cons" << x << endl; }
    ~Test() { cout << "Test des" << x << endl; }
    int x;
};
int main()
{
    vector<Test> vec;
    Test* p1 = new Test(1);
    Test* p2 = new Test(2);
    Test* p3 = new Test(3);
    vec.push_back(*p1);
    vec.push_back(*p2);
    vec.push_back(*p3);

    vec.clear();
    system("pause");
    return 0;
}
复制代码

输出:

 

这里析构了6次,原因是vector的容量永远是大于或者等于size。而当内存不够的时候,会重新allocate新的内存,拷贝数据,deallocate当前内存,;

这里内存变化是1->2->4,所以析构次数是1+2+3=6次。

 

posted @   Brickert  Views(547)  Comments(0Edit  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示