unordered

    科技2022-08-09  116

    unordered_map是C++11提供的新容器。

    unordered_map和map的区别有:

    1.map不允许重复元素。unordered_map允许重复元素。 2.map内部实现了红黑树,会对键名排序,查找的时间复杂度可达到O(logn)。 unordered_map内部实现了一个哈希表,查找的时间复杂度可达到O(1)。

    map

    优点:有序性,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作 红黑树,内部实现一个红黑书使得map的很多操作在lgn的时间复杂度下就可以实现,因此效率非常的高 缺点: 空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点、孩子节点和红/黑性质,使得每一个节点都占用大量的空间 适用处:对于那些有顺序要求的问题,用map会更高效一些

    unordered_map:

    优点: 因为内部实现了哈希表,因此其查找速度非常的快 缺点: 哈希表的建立比较耗费时间 适用处:对于查找问题,unordered_map会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map

    总结: unordered_map执行效率要比map高很多

    unordered_map的用法:

    创建

    unordered_map<int, string> myMap 键类型、值类型

    插入

    unordered_map<int, string> myMap = { { 5, "张大" },{ 6, "李五" } };//使用{}赋值 myMap[2] = "李四"; //使用[ ]进行单个插入,若已存在键值2,则赋值修改,若无则插入。 myMap.insert(pair<int, string>(3, "陈二"));//使用insert和pair插入

    查找

    auto iterator = myMap.find(2);//find()返回一个指向2的迭代器 if (iterator != myMap.end()) cout << endl << iterator->first << "," << iterator->second << endl;

    迭代器访问

    map.end()指向map的最后一个元素之后的地址,无论执行map.erase(iter)还是map.add(key, value),map.end()所返回的值永远不会发生变化,都是指向同一块内存。

    map.begin()指向map的第一个元素,map.begin()可能随着map.erase(iter)或是map.add(key, value)操作而发生改变。例如当第一个元素被删除后,map.begin()就发生了改变,指向原来第一个元素之后的那个元素了。或是如果新插入一个键值对,该键值对的key放到btree(我们假设map内部是由btree实现的,实际上也可能有别的实现方式)中会排在map.begin()->first的前面,那么map.begin()也会指向新插入的这个键值对了。

    map.erase(iter)执行后,当前iter就失去意义了,再执行++iter就会出问题。

    cout << myMap[2] << endl;

    直接返回2的值;如果键名是自定义类型,或者字符串、其他类型; 第一种是:重载==操作符,利用equal_to;另一种方法就是使用函数对象。自定义一个比较函数体。

    Processed: 0.016, SQL: 8