C++ 调用map.erase()函数删除后size()不变

C++ 调用map.erase()函数删除后size()不变,第1张

map

C中的数据结构,用来存储键值对,底层是红黑树实现的,所以查找复杂度为O(logn),有序,默认按照键的升序排列,可以自定义排序方式。

C++的map排序

unordered_map

和map类似,都是存储键值对的字典,区别就是map有序,unordered_map无序,且底层实现是哈希表,所以查找时间复杂度为O(1)

erase函数

map.erase()函数功能是删除一个键,执行erase后如果直接输出的话,size会正常显示,也就是说删除没问题,但是用到了下标之后就会size增加,查找资料后发现,是因为如果键不存在,此时调用下标表示的时候,不管有没有进行赋值 *** 作,比如只是获取size等,都不会报错,而是会默认创建了一个键值对,但是值为空,比如判断a[0]的大小,此时a[0]已经被删除,或创建一个键0,值为对应值类型的默认值,我这里是创建一个空的vector。

但是如果输出的时候a.size这条语句和获取下标语句在一起输出的话就会改变a.size的值,应该是因为cout顺序的原因,它会从后往前计算,先用到了下标a[1],a[5],size+2,然后输出size=3。

cout输出流执行顺序问题

#include
#include
#include
using namespace std;
int main(){
    map<int,vector<int> > a;
    vector<int> b(2,3),c(3,5);
    a[0]=b;a[1]=c;              
    cout<<a.size()<<endl;      //2

    a.erase(0);
    cout<<a.size()<<endl;      //1 ,删除a[0]

    a.erase(1);         
    cout<<a.size()<<endl;      //0   ,删除a[1]
    
    cout<<a[0].size()<<endl;   //0,此时a内没有元素,所以这条语句会创建一个键值对,键为0,
    						   //值为空vector,所以a[0].size=0 
    cout<<a.size()<<endl;      //1,上边创建了键值对,所以a.size=1

    cout<<a.size()<<"\t"<<a[1].size()<<"\t"<<a[5].size()<<endl;    // 3 0 0
    //这里三个函数在一条cout里边,会从后往前计算,所以先创建a[5],a[1],然后输出a.size()
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1296041.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存