map和unordered_map

原文:https://blog.csdn.net/qq_41950186/article/details/107189724

map:红黑树实现

unordered_map:哈希表实现

map:

1. 元素有序,并且具有自动排序的功能(因为红黑树具有自动排序的功能)
2. 元素按照二叉搜索树存储的,也就是说,其左子树上所有节点的键值都小于根节点的键值,右子树所有节点的键值都大于根节点的键值,使用中序遍历可将键值按照从小到大遍历出来
3. 空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点、孩子节点和红/黑性质,使得每一个节点都占用大量的空间
4. 适用情况:对顺序有要求的情况下,如排序等

unordered_map:

1. 元素无序。
2. 查找速度非常的快。
3. 哈希表的建立比较耗费时间
4. 适用情况:对于查找问题
5. 对于unordered_map或者unordered_set容器,其遍历顺序与创建该容器时输入元素的顺序是不一定一致的,遍历是按照哈希表从前往后依次遍历的

总结:

内存占有率的问题就转化成红黑树 VS hash表 , 还是unorder_map占用的内存要高。
但是unordered_map执行效率要比map高很多
对于unordered_map或unordered_set容器,其遍历顺序与创建该容器时输入的顺序不一定相同,因为遍历是按照哈希表从前往后依次遍历的

内置函数:

begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数

 

简单示例:

// map使用
class MapSTL {
public:
    void Update() {
        map<string, int> student;
        // 直接键值索引,存在则更新数据,没有则插入
        student["Zhang"] = 27;
        // pair插入, 键值已存在则会插入失败
        student.insert(pair<string, int>("Li", 15));
        student.insert(make_pair("Wang", 25));
        student.insert(map<string, int>::value_type("xie", 30));

        for (map<string,int>::iterator iter = student.begin(); iter != student.end(); iter++) {
            cout << (*iter).first << ":" << (*iter).second << endl;
        }
    }
};

TEST(MapSTL, update)
{
    MapSTL ms;
    ms.Update();
}

 

posted on 2022-03-26 21:31  蜀山菜鸟  阅读(134)  评论(0)    收藏  举报