C++面试八股文:用过std::set/std::map吗?

这篇具有很好参考价值的文章主要介绍了C++面试八股文:用过std::set/std::map吗?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

面试官:用过std::set/std::map吗?

二师兄:用过。

面试官:能介绍一下二者吗?

二师兄:std::set是一个有序的集合,其中的元素是唯一的,即每个元素只能出现一次。一般用于去重和自动排序。

二师兄:std::map同样是有序组合,只不过它不止有key,每个key还对用一个value。其中key是唯一,不可重复,但是value却没有限制。key/value也被称为键值对。

面试官:知道他们底层使用什么数据结构存储数据的吗?

二师兄:两者都是使用红黑树作为底层的数据结构。红黑树是一种自动平衡的二叉树,它确保插入、删除和查找操作的时间复杂度都是O(log n)

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

二师兄:因为set/map被称为有序容器,所以对插入进去的key有排序的要求。一般需要为类型实现<比较方法,以下代码无法通过编译:

#include <iostream>
#include <set>
struct Foo
{
    Foo(int v):val(v){}
    int val;
};
int main(int argc, char const *argv[])
{
    std::set<Foo> iset;
    iset.insert(Foo(1024));
    iset.insert(Foo(42));
    for(auto it = iset.begin(); it != iset.end(); ++it)
    {
        std::cout << it->val << std::endl;
    }
    return 0;
}

二师兄:此时需要为Foo类型实现bool operator<(const T&, const T&)函数,才能通过编译:

bool operator<(const Foo& lhs,const Foo& rhs) {return lhs.val < rhs.val;}

面试官:按照你的方法,可以实现从小到大的排序。如何实现从大到小的排序?

二师兄:set/map类模板的第二个模板参数可以传入比较类型,默认比较类型是std::less<_Key>,我们可以传入std::greater<T>,此时需要实现bool operator>(const T&, const T&)函数。

二师兄:还有一种方法是手写一个仿函数,重载bool operator()(const T, const T) const函数用于比较两者的大小:

struct Comp
{
    bool operator()(const Foo& lhs, const Foo& rhs) const
    {
        return lhs.val > rhs.val;
    }
};
std::set<Foo,Comp> iset;

面试官:可以修改map中的key吗?

二师兄:不可以。因为map中的keyconst的。强制修改(取地址,const_cast转非const指针,解引用赋值)会造未知的错误。

面试官:当map中不存在某个key时,对map使用map[key]操作会有什么后果?

二师兄:会在map中增加一个键值对,键名为key,值是传入的value类型的默认值。

面试官:如果不希望删除重复的key,有什么办法?

二师兄:STL中提供了std::multisetstd::multimap两个容器,可以存入key相同的多个元素。

面试官:在std::multimap中如何通过key查找value

二师兄:multimap提供了equal_range方法,此方法返回一个pair,分别对应2个迭代器。通过循环迭代器来获取key对应的所有value

#include <iostream>
#include <map>
int main() {
    std::multimap<int, std::string> mmap;
    mmap.insert(std::make_pair(1, "1"));
    mmap.insert(std::make_pair(2, "2"));
    mmap.insert(std::make_pair(3, "3"));
    mmap.insert(std::make_pair(1, "1"));
    auto range = mmap.equal_range(1);
    for (auto it = range.first; it != range.second; ++it) {
        std::cout << it->second << std::endl;
    }
    return 0;
}

面试官:最后一个问题,你觉得单纯的查询而言,是vector快还是map快?

二师兄:当然是map快,因为vector的查询的时间复杂度是O(n),而map是O(logn)

面试官:好的,今天面试结束了,回去等通知吧。

让我们看看最后一个问题:

单纯的查询而言,是vector快还是map快?

这里二师兄的是标准答案,实际上当数据量特别大的时候,的确map是更好的选择。

但当数据量没那么大的时候(少于1000条记录),vector要比map查询速度快。原因我们在之前的面试文章中讲过,vector内存连续,缓存更友好。map底层是红黑树,内存并不连续。

当数据量小的时候,算法的优势没有抵消缓存的劣势,所以vector在数据量小的时候更胜一筹。

“纸上得来终觉浅,绝知此事要躬行”。小伙伴们,一起努力吧!

关注我,带你21天“精通”C++!(狗头)文章来源地址https://www.toymoban.com/news/detail-502968.html

到了这里,关于C++面试八股文:用过std::set/std::map吗?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++面试八股文:std::vector和std::list,如何选择?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第24面: 面试官: list 用过吗? 二师兄:嗯,用过。 面试官:请讲一下 list 的实现原理。 二师兄: std::list 被称为双向链表,和C中手写双向链表本质上没有大的区别。 list 对象中有两个指针,一个指向上一个节点( node ),一

    2024年02月10日
    浏览(30)
  • C++面试八股文:std::string是如何实现的?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第18面: 面试官: std::string 用过吧? 二师兄:当然用过(废话,C++程序员就没有没用过 std::string 的)。 面试官: std::string(\\\"hello\\\")+\\\"world\\\" 、 \\\"hello\\\"+std::string(\\\"world\\\") 和 std::string(\\\"hello\\\")+std::string(\\\"world\\\") 的结果是什么?为什么? 二师

    2024年02月09日
    浏览(30)
  • C++面试八股文:std::array如何实现编译器排序?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第25面: 面试官: array 熟悉吗? 二师兄:你说的是原生数组还是 std::array ? 面试官:你觉得两者有什么区别? 二师兄:区别不是很大,原生数组(非动态数组)和std::array都在栈上开辟空间,初始化的时候需要提供数组长度,且

    2024年02月10日
    浏览(40)
  • C++面试八股文:技术勘误

    不知不觉,《C++面试八股文》已经更新30篇了,这是我第一次写技术博客,由于个人能力有限,出现了不少纰漏,在此向各位读者小伙伴们致歉。 为了不误导更多的小伙伴,以后会不定期的出勘误文章,请各位小伙伴留意。 在《C++面试八股文:C++中,设计一个类要注意哪些东

    2024年02月11日
    浏览(39)
  • C++面试八股文:如何避免死锁?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第31面: 面试官:什么是锁?有什么作用? 二师兄:在C++中,锁(Lock)是一种同步工具,用于保护共享资源,防止多个线程同时访问,从而避免数据竞争和不一致。 面试官:有哪些锁? 二师兄:从种类上分,可以分为普通锁、

    2024年02月12日
    浏览(35)
  • C++面试八股文:什么是构造函数?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第29面: 面试官:什么是构造函数? 二师兄:构造函数是一种特殊的成员函数,用于创建和初始化类的对象。构造函数的名称与类的名称相同,并且没有返回类型。构造函数在对象被创建时自动调用。 面试官:什么是默认构造

    2024年02月11日
    浏览(38)
  • C++面试八股文:什么是智能指针?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第19面: 面试官:什么是智能指针? 二师兄:智能指针是C++11引入的类模板,用于管理资源,行为类似于指针,但不需要手动申请、释放资源,所以称为智能指针。 面试官:C++11引入了哪些智能指针? 二师兄:三种,分别是 s

    2024年02月09日
    浏览(33)
  • C++面试八股文:聊一聊指针?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第17面: 面试官:聊一聊指针? 二师兄:好的。 面试官:你觉得指针本质上是什么? 二师兄:这要从内存地址开始说起了。如果有一块容量是1G的内存,假设它的地址是从 0x00000000 到 0x3fffffff ,每一个字节都对应一个地址。当

    2024年02月09日
    浏览(29)
  • C++面试八股文:了解位运算吗?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第12面: 面试官:了解位运算吗? 二师兄:了解一些。(我很熟悉) 面试官:请列举以下有哪些位运算? 二师兄:按位与( )、按位或( | )、按位异或( ^ ),按位取反( ~ )、左移( )和右移( )。 面试官:好的。那你

    2024年02月08日
    浏览(33)
  • C++面试八股文:什么是RAII?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第13面: 面试官:什么是 RAII ? 二师兄: RAII 是 Resource Acquisition Is Initialization 的缩写。翻译成中文是资源获取即初始化。 面试官: RAII 有什么特点和优势? 二师兄:主要的特点是,在对象初始化时获取资源,在对象析构时释放

    2024年02月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包