【C++】: unordered_map的使用

1、概念

  • key

               键值的类型。unordered_map中的每个元素都是由其键值唯一标识的。

  • T

                映射值的类型。unordered_map中的每个元素都用来存储一些数据作为其映射值。

  • Hash

                一种一元函数对象类型,它接受一个key类型的对象作为参数,并根据该对象返回size_t类型的唯一值。这可以是一个实现函数调用操作符的类,也可以是一个指向函数的指针(参见构造函数)。默认为hash<Key>。

  • Pred

                接受两个键类型参数并返回bool类型的二进制谓词。表达式pred (a, b), pred是这种类型的一个对象,a和b是键值,返回true,如果是应考虑相当于b。这可以是一个类实现一个函数调用操作符或指向函数的指针(见构造函数为例)。这默认为equal_to<Key>,它返回与应用相等操作符(a==b)相同的结果。

  • Allloc

                用于定义存储分配模型的allocator对象的类型。默认情况下,使用allocator类模板,它定义了最简单的内存分配模型,并且与值无关。

  • unordered_map是存储<key, value>键值对的关联式容器,其允许通过keys快速的索引到与 其对应的value。
  • 在unordered_map中,键值通常用于唯一的标识元素(键值是唯一的),而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。
  • 在内部,unordered_map没有对<kye, value>按照任何特定的顺序排序, 为了能在常数范围内 找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。
  • unordered_map容器通过key访问单个元素要比map快,但它通常在遍历元素子集的范围迭 代方面效率较低。
  • unordered_maps实现了直接访问操作符(operator[]),它允许使用key作为参数直接访问 value。

2、构造函数

(1)创建空的unordered_map

    unordered_map<int, int> m;

(2)使用初始化列表初始化

    unordered_map<int, int> m1({ { 1,1 } });
    unordered_map<int, int> m2({
         { 1,1 }
        ,{ 2,2 }
        ,{ 3,3 }});

(3)拷贝构造函数初始化

    unordered_map<int, int> m3(m2);

(4)迭代器初始化 

    unordered_map<int, int> m4(m2.begin(),m2.end());

3、内置函数

3.1、容量

(1)判空(返回bool值)

    unordered_map<int, int> m;
    cout << m.empty();

(2)求大小

    unordered_map<int, int> m;
    m.size();

 (3)返回无序映射容器可以容纳的最大元素数。

    unordered_map<int, int> m;
    cout << m.max_size();

3.2、迭代器

    unordered_map<int, int> v;
    v.begin();          //获取第一个数的位置
    v.end();            //获取最后一个数的位置

    unordered_map<int, string> m;
    m.emplace(make_pair(1, "yi"));
    m.emplace(make_pair(2, "er"));

    unordered_map<int, string>::iterator it = m.begin();
    while (it != m.end())
    {
        cout << (*it).first << " " << (*it).second << endl;
        it++;
    }

3.3、元素访问

    unordered_map<string, string> mymap;

    mymap["Bakery"] = "Barbara";  
    mymap["Seafood"] = "Lisa";    
    mymap["Produce"] = "John";    

    string name = mymap["Bakery"];   
    mymap["Seafood"] = name;

    mymap["Bakery"] = mymap["Produce"];

    name = mymap["Deli"];      
    mymap["Produce"] = mymap["Gifts"];    

  3.4、修改器

(1)emplace(插入)

    unordered_map<int, string> m;
    m.emplace(make_pair(1, "yi"));
    m.emplace(make_pair(2, "er"));

 (2)insert(插入)

使用和emplace类似,但是更加灵活

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;


int main()
{
    unordered_map<string, double>
        myrecipe,
        mypantry = { {"milk",2.0},{"flour",1.5} };

    pair<string, double> myshopping("baking powder", 0.3);

    myrecipe.insert(myshopping);                        // copy insertion
    myrecipe.insert(make_pair<string, double>("eggs", 6.0)); // move insertion
    myrecipe.insert(mypantry.begin(), mypantry.end());  // range insertion
    myrecipe.insert({ {"sugar",0.8},{"salt",0.1} });    // initializer list insertion

    return 0;
}

(3)erase(删除)

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;


int main()
{
    unordered_map<string, string> mymap;

    // populating container:
    mymap["U.S."] = "Washington";
    mymap["U.K."] = "London";
    mymap["France"] = "Paris";
    mymap["Russia"] = "Moscow";
    mymap["China"] = "Beijing";
    mymap["Germany"] = "Berlin";
    mymap["Japan"] = "Tokyo";
   
    // erase examples:
    mymap.erase(mymap.begin());      // erasing by iterator
    mymap.erase("France");             // erasing by key
    mymap.erase(mymap.find("China"), mymap.end()); // erasing by range


    return 0;
}

(4)clear(清空)

(5)swap (交换)

3.5、查找 

(1)find(返回迭代器)

 unordered_map<int, string> m;
 m.emplace(make_pair(1, "yi"));
 m.emplace(make_pair(2, "er"));
    
 unordered_map<int, string>::iterator it = m.find(2);
 while (it != m.end())
 {
     cout << (*it).first << " " << (*it).second << endl;
     it++;
 }

(2)count(计数)

 一般在unordered_map中用不到,因为unordered_map中key的值是唯一的

一般在unordered_multimap中用的较多

4、unordered_map的遍历(迭代)

4.1、迭代器 

unordered_map<int, string>::iterator it = m.begin();
 while (it != m.end())
 {
     cout << (*it).first << " " << (*it).second << endl;
     it++;
 }

4.2、范围for 

    for (auto e : m)
	{
		cout << e.first << " " << e.second << endl;
	}

总结

  1. unordered_map中的的元素是键值对
  2. unordered_map中的key是唯一的,并且不能修改
  3. unordered_map遍历是一个无需的数列
  4. unordered_map的底层为哈希结构
  5. 支持[ ]操作符,operator[ ]中实际进行插入查找

猜你喜欢

转载自blog.csdn.net/weixin_74268082/article/details/134718525