首页 > 编程语言 >C++面试八股文:知道std::unordered_set/std::unordered_map吗?

C++面试八股文:知道std::unordered_set/std::unordered_map吗?

时间:2023-07-11 23:33:43浏览次数:64  
标签:std map 面试官 set const unordered

C++面试八股文:知道std::unordered_set/std::unordered_map吗?

某日二师兄参加XXX科技公司的C++工程师开发岗位第27面:

面试官:知道std::unordered_set/std::unordered_map吗?

二师兄:知道。两者都是C++11引入的新容器,和std::setstd::map功能类似,key唯一,unordered_mapvalue可变。

二师兄:不同于set/map,unordered_set/unordered_map都是无序容器。

面试官:那你知道它们底层怎么实现的吗?

二师兄:两者底层使用哈希表实现,因此插入、删除和查找操作的平均时间复杂度为常数时间O(1)

面试官:既然平均复杂度是O(1),那么是不是可以取代setmap了?

二师兄:这里是平均的时间复杂度。哈希表插入、删除和查找操作的最差时间复杂度是O(n),要比set/mapO(log n)大。

面试官:那你觉得哪些场景适合set/map,哪些场景适合unordered_set/unordered_map

二师兄:set/map适用于需要有序存储和快速查找的场景,而unordered_set/unordered_map适用于需要快速插入和查找的场景。

面试官:unordered_set/unordered_map对于key的类型有什么要求吗?

二师兄:因为unordered_set/unordered_map底层采用哈希表,所以在使用自定义类型作为key的时候,需要告诉编译器如何计算此类型的hash值,同时还要告诉编译器如何判断两个自定义类型的对象是否相等。以下代码无法通过编译:

#include <iostream>
#include <unordered_set>
struct Foo
{
    std::string str;
    int val;
};
int main(int argc, char const *argv[])
{
    std::unordered_set<Foo> uset;
    uset.insert({"42",42});
    uset.insert({"1024",1024});
    return 0;
}

二师兄:此时需要为Foo类型实现bool operator==(const Foo& o) const函数和size_t operator()(const Foo& f) const仿函数,才能通过编译:

#include <iostream>
#include <unordered_set>
struct Foo
{
    std::string str;
    int val;
    bool operator==(const Foo& o) const
    {
        return str == o.str && val == o.val;
    }
};
struct Hash
{
    size_t operator()(const Foo& f) const
    {
        return std::hash<std::string>()(f.str) ^ std::hash<int>()(f.val);
    }
};
int main(int argc, char const *argv[])
{
    std::unordered_set<Foo,Hash> uset;
    uset.insert({"42",42});
    uset.insert({"1024",1024});
    return 0;
}

二师兄:当然我们也可以使用std::function或者lambda来代替仿函数,目的都是为了使得编译器知道如何计算自定义类型的哈希值。

面试官:用过unordered_multiset/unordered_multimap吗?

二师兄:没用过。但是应该和multiset/multimap类似,只是底层也采用hash表实现。

面试官:好的,今天的面试就结束了,请回去等消息吧。

对于今天面试官的表现,小伙伴们能给几分呢?不是面试官要放水,面完set/map之后再面unordered_set/unordered_map,真的没有那么多好问题,因为两者太像了。。。

标签:std,map,面试官,set,const,unordered
From: https://www.cnblogs.com/bujidao1128/p/17546280.html

相关文章

  • mapbox添加自定义控件
    需要定义一个类,然后至少重写实现onAdd、onRemove方法,示例如下<template><divref="changeViewRef"@click="changeView"class="changeViewmapboxgl-ctrl"><el-tooltipclass="box-item"effect="dark"......
  • 论文阅读 | Penetration Testing Active Reconnaissance Phase – Optimized Port Sca
    我们可以使用TCP端口扫描对物联网设备进行分类吗?https://ieeexplore.ieee.org/document/8913346 1介绍在[10]中,我们根据统计属性(如活动周期,端口号,信令模式和密码套件)来表征物联网流量。此外,提出了一个多阶段机器学习模型,使用从配备特殊硬件加速(例如NetFlow)的网络交换机......
  • SQ工具|9|数据安全|ArcMap自动保存|ArcMap自动备份插件
    可解决在作业过程中停电、软件闪退等一系列问题导致的ArcMap自动退出而未来得及保存数据造成的数据丢失的问题一、自动保存在开启编辑的状态下,设置保存周期,状态选择开启点击确认即可开启自动保存任务(提示框位于右下角)  当一个保存周期内数据未变化时,将不会触发自动保存。......
  • 动态数组和C++ std::vector详解
    目录1.std::vector2.vector的用法    2.1vector的定义和声明    2.2成员函数        2.2.1基本函数            operator=            assign            get_allocator        2.2.2元素访问   ......
  • 跳出循环可不要再用forEach,map也不好用,不妨直接用for循环
    需求:循环一个数组保持请求顺序请求接口,且当前数组的值为1时,又需要异步请求另一个接口根据返回status值跳出本次循环。解决思路:使用for循环,首先在循环中判断数组中值为1的,用async和await异步请求返回数据状态跳出循环;同时把符合条件的所有请求接口push到一个数组中去,最后Promise.a......
  • DevTools 无法加载源映射: 无法加载httplocalhost8081staticscssbootstrap.min.css.map
    DevTools无法加载源映射:无法加载http://localhost:8081/statics/css/bootstrap.min.css.map的内容:HTTP错误:状态代码404,net::ERR_HTTP_RESPONSE_CODE_FAILURE 解决办法:找到bootstrap.min.css,删除最后一行注释 注意:如果是css报错就删除:/*#sourceMappingURL=bootst......
  • C++面试八股文:用过std::set/std::map吗?
    C++面试八股文:用过std::set/std::map吗?某日二师兄参加XXX科技公司的C++工程师开发岗位第27面:面试官:用过std::set/std::map吗?二师兄:用过。面试官:能介绍一下二者吗?二师兄:std::set是一个有序的集合,其中的元素是唯一的,即每个元素只能出现一次。一般用于去重和自动排序。......
  • C#对象映射器Mapster
    1.前言    在开发中,我们经常用到对象之间的映射。谈到对象映射器,我们比较熟知的肯定是AutoMapper,但很少人会知道Mapster。今天在这里我们一起探讨一下什么是Mapster?为什么有了AutoMapper映射器了,还要学习使用Mapster?2.什么是Mapster?    Mapster是一个.NET库,它......
  • 如何使用C++11 STD::THREAD设置堆栈大小?
    本教程将介绍如何使用C++11std::thread设置线程的堆栈大小。C++11std::thread是一种轻量级的多线程实现,它的灵活性使得它成为一个流行的选择。但是,在某些情况下,您可能需要设置线程的堆栈大小来满足您的需求。在开始本教程之前,我们假设您已经熟悉了C++11std::thread的基础知识......
  • 离奇的std::map、std::set崩溃
    离奇的std::map、std::set崩溃现象描述定位之路1、和windows调用比较,没发现任何问题2、修改cmakelists.txt,发现也没有什么可以改的,能改的怎么改结果都一样3、最笨的办法之一用上,写一段这样的代码:4、面向互联网大法编程,百度、微软必应(不FQ,不能狗狗),发现一个帖子,缩小有问题代......