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()
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)