一、map
1. 使用map 要先包含头文件 #include <map>;
2. map 内部的实现原理:
map内部实现了一个红黑树,该结构具有自动排序的功能,因此map内部的所有元素都是有序的,
红黑树的每一个节点都代表着map的一个元素,
因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行这样的操作,
故红黑树的效率决定了map的效率。
3. 优点:
有序性,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作。
【注】:这个有序,指的是下标的有序。
红黑树,内部实现一个红黑书使得map的很多操作在lgn的时间复杂度下就可以实现,
因此效率非常的高。
4. map常用函数和定义,百度即可。
二、unordered_map
同理:
1. #include <unordered_map>
2. 内部实现原理: 使用了哈希表,因此元素的排序是杂乱的,切不可以事先分配数量
3. 优点:比map更高效,且查找时间复杂度为O(1);
三、map和unordered_map使用时,不同之处(不清楚为什么)
1. 问题:
// 不懂:
// 遍历m1所有元素
// map 是可以这样操作的
map<int, int>::iterator iter;
for (iter = m1.begin(); iter != m1.end(); iter++)
{
cout << iter->first << " : " << iter->second << endl;
}
// unordered_map 会出错:在for循环的“=”处,提示:没有匹配的操作数
unordered_map<int, int>::iterator iter = nullptr;
for (iter = m2.begin(); iter != m2.end(); iter++)
{
cout << iter->first << " : " << iter->second << endl;
}
// 如果在for循环里面定义iter,就不会报错。 不太理解哪里出了问题
for (unordered_map<int,int>::iterator iter = m2.begin(); iter != m2.end(); iter++)
{
cout << iter->first << " : " << iter->second << endl;
}
2.总结:
2.1 在遍历时,统一使用auto
for(auto iter = m.begin(); iter!=m.end(); ++iter)
{
}
2.2 新的for循环 // i代表m中的元素,访问用'.'
for(auto i : m)
{
}