map左边只有结构体指针时,地址分配由创建顺序由大到小,map左边排序按照指针地址数值大小由大到小进行排序,不同于平时的由小到大。
1 #include2 #include
map左边为int指针时,数组为int[]时,int指针地址随着创建的先后顺序,地址数值依次变小,但是map中排序按照地址数值从小到大。
1 #include2 #include
当map左边为结构体指针时,且结构体指针有数组的情况时,结构体指针的地址由小到大,map里面排序按照地址数值由小到大
1 #include2 #include
当map左边是结构体指针和普通的结构体对象时的不同
1 //#include2 #include 3 using namespace std; 4 typedef struct tree* T; 5 struct tree{ 6 string name; 7 int id; 8 T next; 9 tree(string s,int i) 10 { 11 this->name=s; 12 this->id=i; 13 } 14 bool operator<(const tree &a)const 15 { 16 return a.name<name; 17 } 18 }; 19 int main() 20 { 21 map int> m; 22 T t=new tree("hello",5);/*指针类型创建对象有new*/ 23 m[t]=9; 24 T f=new tree("hello",5); 25 m[f]=9; 26 for(auto i:m) 27 { 28 cout< name<<" "< id<<" i.second="< endl; 29 } 30 t->id=7; 31 m[t]=6; 32 for(auto i:m) 33 { 34 cout< name<<" "< id<<" i.second="< endl; 35 } 36 cout<<"可见,map左边为指针时,修改指针上的值,对已经存进map的数据也有修改。\n"; 37 cout<<"以上是tree指针的map,以下是tree实体对象的map\n"; 38 map int> p; 39 tree tr=tree("world",8);/* 实体对象就不用new了*/ 40 p[tr]=4; 41 for(auto i:p) 42 { 43 cout< " "< " i.second="< endl; 44 } 45 tr.id=7; 46 p[tr]=6; 47 for(auto i:p) 48 { 49 cout< " "< " i.second="< endl; 50 } 51 cout<<"可见,map左边为普通的实体对象时,修改对象上的数据,对已经存进map的数据没有修改\n"; 52 }
Last,map左边为具体结构体对象时,map[tree]=5;存进去的只是这个结构体当时的状态,所以,存进去以后再修改对象结构体里面的数据,对map没有影响,但仍然可以map[tree]=6,通过这样的方式来修改键值对的值。
当map左边是结构体指针的时候,map[T]存进去的是地址,等需要使用的时候,map会根据地址,找到地址上的值来输出,所以改动有效。
1 //#include2 #include 3 using namespace std; 4 typedef struct tree* T; 5 struct tree{ 6 string name; 7 int id; 8 T next; 9 tree(string s,int i) 10 { 11 this->name=s; 12 this->id=i; 13 } 14 bool operator<(const tree &a)const 15 { 16 return a.name<name; 17 } 18 }; 19 int main() 20 { 21 map int> m; 22 T t=new tree("hello",5);/*指针类型创建对象有new*/ 23 m[t]=9; 24 for(map int>::iterator it=m.begin();it!=m.end();it++) 25 { 26 cout<<"&dizhi="<<&it->first<<endl; 27 cout< first->name<<" "< first->id<<" i.second="< second<<endl; 28 } 29 cout<<"t="< endl; 30 t->id=7; 31 m[t]=6; 32 for(map int>::iterator it=m.begin();it!=m.end();it++) 33 { 34 cout<<"&dizhi="<<&it->first<<endl; 35 cout< first->name<<" "< first->id<<" i.second="< second<<endl; 36 } 37 /*for(auto i:m) 38 { 39 cout<<"&dizhi="<<&i.first< 40 cout< > p; 47 tree tr=tree("world",8);/* 实体对象就不用new了*/ 48 p[tr]=4; 49 /*for(auto i:p) 50 { 51 cout<<"&dizhi="<<&i.first<name<<" "< 44 cout<<"可见,map左边为指针时,修改指针上的值,对已经存进map的数据也有修改。\n"; 45 cout<<"以上是tree指针的map,以下是tree实体对象的map\n"; 46 mapid<<" i.second="< 41 }*/ 42 /* 这里有个未解之谜,就是上面两次用auto,前后两次的i.first的地址不一样。 */ 43 cout<<"t="< endl; int 52 cout< >::iterator it=p.begin();it!=p.end();it++) 55 { 56 cout<<"&dizhi="<<&it->first<<endl; 57 cout<53 }*/ 54 for(mapint first.name<<" "< first.id<<" i.second="< second<<endl; 58 } 59 tr.id=7; 60 p[tr]=6; 61 /*for(auto i:p) 62 { 63 cout<<"&dizhi="<<&i.first< 64 cout< >::iterator it=p.begin();it!=p.end();it++) 67 { 68 cout<<"&dizhi="<<&it->first<<endl; 69 cout<65 }*/ 66 for(mapint first.name<<" "< first.id<<" i.second="< second<<endl; 70 } 71 cout<<"可见,map左边为普通的实体对象时,修改对象上的数据,对已经存进map的数据没有修改\n"; 72 }