map实际采用了红黑树的实现,在此,我们先不讨论map的底层实现结构原理,先来看看map究竟是怎么用,以及我是怎么看待map的.
先上代码:
1 #include <map> 2 #include <string> 3 #include <iostream> 4 using namespace std; 5 int main() 6 { 7 map<int, string> mapStudent; 8 mapStudent.insert(pair<int, string>(1, "student_one")); 9 mapStudent.insert(pair<int, string>(2, "student_two")); 10 mapStudent.insert(pair<int, string>(4, "student_four")); 11 mapStudent[4] = "student_three";//通过访问键值来修改键值对应的元素 12 mapStudent[5] = "student_five";//若某个新的键值在map中不存在,[]的作用是将这个新的键值以及元素插入到map中 13 mapStudent.insert(map<int, string>::value_type(3, "fuck"));//这一句并没有改变键值3对应的元素值student_three 14 mapStudent.insert(pair<int, string>(3, "lucy"));//这一句并没有改变键值3对应的元素值student_three,因为键值不能重复 15 map<int, string>::iterator iter; 16 for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++) 17 18 cout << (*iter).first << ' ' << (*iter).second << endl; 19 //out: 20 /* 1 student_one 21 2 student_two 22 3 fuck 23 4 student_three 24 5 student_five*/ 25 //研究map键值与元素的修改情况 26 iter = mapStudent.begin(); 27 //(*iter).first = 4;//报错:表达式必须是可修改的左值 28 cout <<"原始元素为"<< (*iter).second << endl; 29 (*iter).second = "LTQ"; 30 cout << "新元素为" << (*iter).second << endl; 31 //out: 32 /*原始元素为student_one 33 新元素为LTQ*/ 34 system("pause"); 35 return 0; 36 37 }
上述代码,描述了关于map的应用,从中可以看到这些特点:
1 map 每个节点存在键值和元素,因此pair关键字实际上在map中很常用。
2 map的键值不能重复,也就是不能存相同的键值
3 通过first和second可以访问map的键值和元素
4 map的键值是不能被更改的,元素可以被更改
5 iter != mapStudent.end();关于这一句,我们通常可能根据习惯写成iter < mapStudent.end();但实际上,编译并不能通过。实际上,迭代器并没有重载<运算符!!!
核心:
map可以看做是一种广义的数组,或者说是泛型数组。数组本质上仍然具有键值和元素两个成员(键值其实是其下标,我们通过下标访问数组的元素)。但是对于map而言,这个下标是一种泛型结构,在内存中也不再连续。通常以类的形式存在。因此map具有更为广泛意义的“数组”的本质