从输出结果中可以看出,我们成功使用unordered_map容器进行了快速元素查找,并且找到了存在的元素,并输出了它的键和值;同时,找到了不存在的元素,并输出了元素不存在的消息。
先对 key 算出 hash code找到这个 hash code 对应的桶在这个桶里面,遍历去找这个 key 对应的节点把节点返回但是如果找不到节点,不是返回空,而是会创建一个新的空白节点,然后返回这个空白节点。这里本质上是一个insert操作,所以在多线程读unordered_map的时候,需要注意如果有判断元素是否存在的场景,避免使用[]...
然而,由于std::unordered_map是无序的,它在插入、查找和删除元素的操作上通常比std::map更高效,因为哈希表提供了 O(1) 的平均时间复杂度。 内存占用:由于红黑树的结构,std::map在存储上通常比std::unordered_map更占用内存空间。而std::unordered_map则需要一定的额外空间来存储哈希函数和桶结构。 迭代器稳定性...
std::map是有序关联容器,按照键值进行自动排序,默认按照键的升序排列。 内部实现使用红黑树(Red-Black Tree),因此查找、插入和删除操作的平均时间复杂度为 O(log n)。 需要额外的空间来存储树节点的指针,因此相对于std::unordered_map占用更多的内存。 std::unordered_map: std::unordered_map是无序关联容器,不...
unordered_map<std::string, int> umap2 {{"Apple", 1}, {"Banana", 2}, {"Cherry", 3}};// 使用另一个 unordered_map 容器进行初始化// 函数原型:unordered_map(const unordered_map&);// 用另一个 unordered_map 来初始化新的 unordered_mapstd::unordered_map<std::string, int> umap3(umap2...
第一张图是用const char*作key的,第二张则是用std::string作key的。可以看到除去std::unordered_map的构造函数,剩下的基本是hash、operator new这两个函数占时间了。在const char*作key的时,hash函数占了22%,new函数占9.66%,而std::string时,new占了15.42,hash才9.72%,因此这两者的效率没差多少。
二师兄:set/map适用于需要有序存储和快速查找的场景,而unordered_set/unordered_map适用于需要快速插入和查找的场景。 面试官:unordered_set/unordered_map对于key的类型有什么要求吗? 二师兄:因为unordered_set/unordered_map底层采用哈希表,所以在使用自定义类型作为key的时候,需要告诉编译器如何计算此类型的hash值,同...
对于存储大量数据并需要快速查找的场景,std::unordered_map 通常具有更好的性能,因为它的查找操作更快速。但是,如果你需要按照键的顺序进行遍历或者需要有序的存储,那么 std::map 是更合适的选择。 需要注意的是,由于哈希表的实现依赖于哈希函数,因此 std::unordered_map 在某些情况下可能会出现哈希冲突,导致性能下...
unordered_map<int,string>myMap={{ 5, "张大" },{ 6, "李五" }};//使用{}赋值 myMap[2] = "李四"; //使用[ ]进行单个插入,若已存在键值2,则赋值修改,若无则插入。 myMap.insert(pair<int,string>(3, "陈二"));//使用insert和pair插入 ...
用于哈希表存储桶的字节取决于内部列表的存储方式 - std::unordered_map::bucket_size 具有恒定的复杂性,因此我们可能会得出结论,将有一个 size() 和链表迭代器桶,所以 m.bucket_count() * (sizeof(size_t) + sizeof(void*)) ,尽管由于 load_factor() 受到限制并且没有 size 存储每个桶,因此可能只有恒定...