面试之快速学习STL-map

这篇具有很好参考价值的文章主要介绍了面试之快速学习STL-map。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关联式容器

  1. 包括 map、multimap、set 以及 multiset 这 4 种容器。
  2. 和序列式容器区别:
    a . 关联式容器在存储元素时还会为每个元素在配备一个键,整体以键值对的方式存储到容器中。
    b . 相比前者,关联式容器可以通过键值直接找到对应的元素,而无需遍历整个容器。
    c . 另外,关联式容器在存储元素,默认会根据各元素键值的大小做升序排序
    d . 相比其它类型容器,关联式容器查找、访问、插入和删除指定元素的效率更高。

注意 : 关联式容器所具备的这些特性,归咎于 STL 标准库在实现该类型容器时,底层选用了 「红黑树」

关联式容器名称 特点
map 定义在 头文件中,使用该容器存储的数据,其各个元素的键必须是唯一的(即不能重复),该容器会根据各元素键的大小,默认进行升序排序(调用 std::less)。
set 定义在 头文件中,使用该容器存储的数据,各个元素键和值完全相同,且各个元素的值不能重复(保证了各元素键的唯一性)。该容器会自动根据各个元素的键(其实也就是元素值)的大小进行升序排序(调用 std::less)。
multimap 定义在 头文件中,和 map 容器唯一的不同在于,multimap 容器中存储元素的键可以重复。
multiset 定义在 头文件中,和 set 容器唯一的不同在于,multiset 容器中存储元素的值可以重复(一旦值重复,则意味着键也是重复的)。

除此之外,C++ 11 还新增了 4 种哈希容器,即 unordered_map、unordered_multimap 以及 unordered_set、unordered_multiset。严格来说,它们也属于关联式容器,但哈希容器底层采用的是哈希表,而不是红黑树

map

  1. map 各个键值对的键和值可以是任意数据类型,包括 C++ 基本数据类型(int、double 等)、使用结构体或类自定义的类型
  2. 与此同时,在使用 map 容器存储多个键值对时,该容器会自动根据各键值对的键的大小,按照既定的规则进行排序。默认情况下,map 容器选用std::less排序规则(其中 T 表示键的数据类型), 其会根据键的大小对所有键值对做升序排序
  3. 使用 map 容器存储的各个键值对,键的值既不能重复也不能被修改。换句话说,map 容器中存储的各个键值对不仅键的值独一无二,键的类型也会用 const 修饰,这意味着只要键值对被存储到 map 容器中,其键的值将不能再做任何修改。

1. 初始化

std::map<std::string, std::strig> my_map1 = {{"k1", "v1"},{"k2", "v2"}};

std::map<std::string, std::strig> my_map1 = {std::make_pair("k1", "v1"),std::make_pair("k2", "v2")};

2. 迭代器

  1. map 容器配备的是双向迭代器
  2. lower_bound(key) :返回的是指向第一个键不小于 key 的键值对的迭代器;
  3. upper_bound(key) :返回的是指向第一个键大于 key 的键值对的迭代器;
  4. equal_range(key) :该方法会返回一个 pair 对象,其中的 2 个元素都是迭代器类型,其中 pair.first 实际上就是 lower_bound(key) 的返回值,而 pair.second 则等同于 upper_bound(key) 的返回值。

注意: 上述更加适用于multimap, map 只会返回一个结果。

3. map插入方式

  1. 使用 [ ] 运算符:
    a. 当操作对象为 map 容器中已存储的键值对时,则借助 [ ] 运算符,既可以获取指定键对应的值,还能对指定键对应的值进行修改
    b. 反之,若 map 容器内部没有存储以 [ ] 运算符内指定数据为键的键值对,则使用 [ ] 运算符会向当前 map 容器中添加一个新的键值对,为默认值。
  2. insert() 成员方法
    a. 无需指定插入位置,直接将键值对添加到 map 容器中:
//1、引用传递一个键值对
pair<iterator,bool> insert (const value_type& val);
//2、以右值引用的方式传递键值对
template <class P>
    pair<iterator,bool> insert (P&& val);
  

如果成功插入 val,则该迭代器指向新插入的 val,bool 值为 true;
如果插入 val 失败,则表明当前 map 容器中存有和 val 的键相同的键值对(用 p 表示),此时返回的迭代器指向 p,bool 值为 false。

注意: 使用这种方法,不会覆盖原有的值意思是如果本来存在一个key,那么就插入失败。

4. 如何向一个map容器中添加一个元素,有什么区别?

  1. map::operator[]和map::insert两种方法都可以实现向map容器中添加一个元素的目的。至于它们之间的区别,这里需要分类讨论:被添加的元素事先在map中不存在;被添加的元素事先在map中已存在。
被添加的元素事先在map中不存在
  1. map::operator[]会在map中创建一个元素(k, v),其中v通过默认构造函数创建。map::operator[]返回v的引用,紧接着v被赋予为新值。听上去已经有点冗余了。
  2. 而map::insert高效很多,直接使用目标值构造一个v,不需要赋值操作。
  3. 结论就是如果被添加的元素事先在map中不存在,map::insert的效率要好于map::operator[]。
被添加的元素事先在map中存在
  1. map::operator[]会返回一个引用,指向map中相同k对应的v,之后用目标值更新原来的v。
  2. 而map::insert就复杂了,如果元素事先已经在map中存在,map::insert会以失败告终,详见测试代码执行结果打印出来的“failed in testmap.insert(make_pair(2, 100.4));”。2. map::insert如果想要达到更新的目的,需要根据insert操作的结果作出进一步赋值操作。这里隐含着pair对象的构建和析构,是相较于map::operator[]多余的操作。
  3. 结论就是如果被添加元素事先在map中存在,map::operator[]的效率要好于map::insert。

5. STL之map容器的三种插入方式insert emplace emplace_hint哪种效率更高

  1. 结论: C++11新增的emplace() 和 emplace_hint()都比insert效率高
  2. 原因: 使用 insert() 向 map 容器中插入键值对的过程是,先创建该键值对,然后再将该键值对复制或者移动到 map 容器中的指定位置;
  3. 使用 emplace() 或 emplace_hint() 插入键值对的过程是,直接在 map 容器中的指定位置构造该键值对。
template <class... Args>
  pair<iterator,bool> emplace (Args&&... args);
  //参数 (Args&&... args) 指的是,这里只需要将创建 新键值对所需的数据作为参数直接传入即可,此方法可以自行利用这些数据构建出指定的键值对。另外,该方法的返回值也是一个 pair 对象,其中 pair.first 为一个迭代器,pair.second 为一个 bool 类型变量:
当该方法将键值对成功插入到 map 容器中时,其返回的迭代器指向该新插入的键值对,同时 bool 变量的值为 true;
当插入失败时,则表明 map 容器中存在具有相同键的键值对,此时返回的迭代器指向此具有相同键的键值对,同时 bool 变量的值为 false。
//创建并初始化 map 容器
    std::map<string, string>mymap;
    //插入键值对
    pair<map<string, string>::iterator, bool> ret = mymap.emplace("STL教程", "http://c.biancheng.net/stl/");
    cout << "1、ret.iter = <{" << ret.first->first << ", " << ret.first->second << "}, " << ret.second << ">" << endl;

注意: []直接不参与战争
引用链接:https://blog.csdn.net/weixin_39703605/article/details/108190578文章来源地址https://www.toymoban.com/news/detail-653468.html

到了这里,关于面试之快速学习STL-map的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • C++ STL map

    map 中每一个元素都是一个 key-value 对,数据类型为 pair std::pair 主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型。 pair 实质上是一个结构体,其主要的 两个成员变量 是 first 和 second ,这两个变量可以直接使用。 初始化一个 pair 可以使用构造函

    2024年02月11日
    浏览(36)
  • C++ STL库 map

    用于将两个数据映射起来,就是同过一个数据,可以找到另一个数据。 所以它存储的数据是成对的。也就是存储的是一个对组。 C++ Maps 被用作储存“/值”对 运行结果: 语法: begin()函数返回一个迭代器指向map的第一个元素。 语法: clear()函数删除map中的所有元素。 语法

    2024年02月09日
    浏览(30)
  • STL容器详解——map容器

    作为关联式容器的一种, map 容器存储的都是 pair 对象,也就是用 pair 类模板创建的键值对。其中,各个键值对的键和值可以是任意数据类型,包括 C++ 基本数据类型(int、double 等)、使用结构体或类自定义的类型。 通常情况下,map 容器中存储的各个键值对都选用 string 字符

    2024年02月14日
    浏览(35)
  • C++STL——map/multimap容器详解

    纵有疾风起,人生不言弃。本文篇幅较长,如有错误请不吝赐教,感谢支持。 在STL中有些容器的元素是一种叫pair的数据结构。 对组(pair)是类模板,对组(pair)将一对值组合成一个值,一般用于表示key/value数据,这一对值可以具有不同的数据类型,两个值可以分别用pair的两个公

    2024年02月14日
    浏览(40)
  • Spring进阶学习(附面试快速答法)

    思维导图 Spring框架中的单例bean是线程安全的吗? Spring框架中的bean是单例的吗? 是的,Spring框架中有一个@Scope注解,默认的值就是singleton,单例的 但是单例bean不是线程安全的 举个栗子:我们看一段服务器中的代码片段 Spring框架中的单例bean是线程安全的吗? 不是线程安全

    2024年02月11日
    浏览(33)
  • 详解 C++中STL的map/multimap

    ap容器中所有元素都是pair,pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)。 同时,所有元素都会根据元素的键值自动排序。 map/multimap属于关联式容器,底层数据结构是用二叉树实现的。它的优点就是可以根据key值快速找到value值。 这里需要了解map与

    2024年02月16日
    浏览(48)
  • 面试之快速学习计算机网络-http

    2. 3开头重定向,4开头客户端错误,5开头服务端错误 1. start-line:请求行,可以为以下两者之一: 请求行: GET /hello-world2.html HTTP/1.1 状态行:HTTP/1.1 200 OK 请求行由 方法字段 、 URL字段 和 HTTP协议版本字段 。其中,方法字段严格区分大小写,当前HTTP协议中的方法都是大写 状态

    2024年02月11日
    浏览(47)
  • STL之unordered_map使用方法

    C++的STL(Standard Template Library)是C++标准库的一部分,它提供了一组通用的模板类和函数,实现了很多常见的数据结构和算法,使得C++程序员能够更方便地进行开发。STL的设计目标是提供高性能、通用性和可移植性。 STL主要包括以下几个组件: 容器(Containers): 提供了各种

    2024年01月23日
    浏览(29)
  • 【C++】STL之map、set类源码剖析

    目录 概述 算法 源码 Iterator.h RBTree.h Map.h Set.h test.cpp map和set都是STL中的关联式容器,而vector、list、deque是序列式容器。 map是映像,set是集合,map元素的数据类型是std::pairK,V格式(key/value形成映像),set元素的数据类型只有key值。 map和set的实现是对红黑树的封装,map根据key值进行

    2024年02月02日
    浏览(39)
  • 【C++ STL之map,set,pair详解】

    在C++的STL(Standard Template Library)中,map是一个非常有用的关联容器。它提供了一种键-值对的数据结构,其中的元素按照键的顺序进行排序,并且每个键是唯一的。本文将详细介绍C++ STL中map的使用方法和一些常见操作。 (1)头文件 (2)初始化方法 可以使用以下方式声明和

    2024年02月12日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包