C++ unordered_map的完整指南

1,649 阅读2分钟

C++ unordered_map容器比典型的map容器要快。 这要归功于无序地图使用哈希表实现的事实。

C++ unordered_map

C++ unordered_map是一个内置的容器,用于存储键-值对形式的元素。 在unordered_map容器中,值没有以任何特定的方式在内部定义。

键值和映射值的数据类型既可以是预定义的,也可以是当时执行的,值被插入到容器中。

在内部,C++ unordered_map使用哈希表实现,提供给map的键被哈希成哈希表的索引,这就是为什么数据结构的性能很大程度上取决于哈希函数,但平均来说,从哈希表中搜索、插入和删除的成本是O(1)。

地图的键值与表的哈希值相连,然后被组织到不同的桶中。 这样,一旦哈希值被计算出来,编译器就可以快速访问指定元素所在的确切桶。

语法

unordered_map<key_datatype, mapped_datatype> map_name;

显示创建无序地图容器的程序

#include <iostream>
#include <iterator>
#include <unordered_map>
using namespace std;
int main()
{
    unordered_map<int, char> map1;
    unordered_map<int, char>::iterator cursor;
    map1[1] = 'a';
    map1[2] = 'b';
    cout << "KEY\tELEMENT" << endl;
    for (cursor = map1.begin(); cursor != map1.end(); cursor++)
    {
        cout << cursor->first;
        cout << '\t' << cursor->second << '\n'
             << endl;
    }
}

请看下面的输出:

C++ Unordered_map Example

C++ Unordered_maps的比较:

与通常的地图容器

在地图容器中,元素是按照正确的顺序放置的,而在无序地图中,顺序是完全随机的。这是因为地图容器是用具有特定遍历路径的树形结构来实现的。不过,无序地图是使用哈希表完成的。

但是,这使得无序地图的访问速度相当快,时间复杂度为O(1),而典型的地图容器的时间复杂度为O(nlogn)。

使用无序集

在无序集合中,元素不是以键值对的形式存储的,而只是以键的形式用于判断集合中项目的存在。

但是用无序地图,我们可以有一个元素存在的频率,而不仅仅是它的存在。

无序地图的方法

begin()。

begin()函数返回一个双向的迭代器,指向地图的第一个元素。这个函数不需要传递任何参数,并在完成后显示一个错误。

语法:

mapcontainer_name.begin();

请看下面的程序:

#include <iostream>
#include <iterator>
#include <map>
using namespace std;
int main()
{
  map<int, char> map1;
  map<int, char>::iterator cursor;
  map1[1] = 'a';
  map1[2] = 'b';
  map1.begin();
}

(返回一个指向地图第一个元素的迭代器。)

end()

end()函数是为了返回一个双向的迭代器,指向地图容器中最后一个元素旁边的元素。

就像begin()函数一样,这也不需要任何参数。此外,由于它指向一个非有效元素,所以它不能被取消引用。

语法

mapcontainer_name.end();

请看下面的程序:

#include <iostream>
#include <iterator>
#include <map>
using namespace std;
int main()
{
  map<int, char> map1;
  map<int, char>::iterator cursor;
  map1[1] = 'a';
  map1[2] = 'b';
  map1.end();
}

(返回指向地图最后一个元素的下一个迭代器)

at()

at()函数用于访问无序地图容器中的映射值,这些映射值的键值你都知道。

语法。

mapcontainer_name.at(key_value);

请看下面的程序

#include <iostream>
#include <iterator>
#include <unordered_map>
using namespace std;
int main()
{
  unordered_map<int, char> map1;
  unordered_map<int, char>::iterator cursor;
  map1[1] = 'a';
  map1[2] = 'b';
  cout << map1.at(2) << endl;
}

请看下面的输出:

Syntax

bucket()

bucket()函数用来获取桶的编号,该桶中存放着你作为参数提供的键值的映射值。

语法

mapcontainer_name.bucket(key_value);

见下面的程序:

#include <iostream>
#include <iterator>
#include <unordered_map>
using namespace std;
int main()
{
  unordered_map<int, char> map1;
  unordered_map<int, char>::iterator cursor;
  map1[1] = 'a';
  map1[2] = 'b';
  cout << map1.bucket(2) << endl;
}

见下面的输出:

obucket

bucket_count()

bucket_count()函数是用来获取无序地图容器中的桶的总数。这个函数不需要任何参数。

语法:

mapcontainer_name.bucket(key_value);

见下面的程序:

#include <iostream>
#include <iterator>
#include <unordered_map>
using namespace std;
int main()
{
  unordered_map<int, char> map1;
  unordered_map<int, char>::iterator cursor;
  map1[1] = 'a';
  map1[2] = 'b';
  cout << map1.bucket_count() << endl;
}

见下面的输出:

ibucket_count

bucket_size()

bucket_size()函数用于获取无序地图容器的单个桶中的元素数量。

语法

mapcontainer_name.bucket_size(bucket_value);

请看下面的程序:

#include <iostream>
#include <iterator>
#include <unordered_map>
using namespace std;
int main()
{
  unordered_map<int, char> map1;
  unordered_map<int, char>::iterator cursor;
  map1[1] = 'a';
  map1[2] = 'b';
  cout << map1.bucket_size(2) << endl;
}

参见下面的输出:

obucket_size

count()

count()函数是用来获取容器中具有相同键值的几个元素。但由于一个map容器只允许一个具有一定键值的映射值,这个函数只检查一个键是否存在。

语法

mapcontainer_name.count(key_value);

见下面的程序:

#include <iostream>
#include <iterator>
#include <unordered_map>
using namespace std;
int main()
{
  unordered_map<int, char> map1;
  unordered_map<int, char>::iterator cursor;
  map1[1] = 'a';
  map1[2] = 'b';
  cout << map1.count(1) << endl;
}

请看下面的输出:

ocount

equal_range()

equal_range()函数返回范围K的初始和结束迭代器,该范围包含所有键值等于K的元素。现在,由于在map容器中,没有重复的键值,该范围最多包含一个值。

语法

mapcontainer_name.equal_range(key_value);

请看下面的程序:

#include <iostream>
#include <iterator>
#include <unordered_map>
using namespace std;
int main()
{
    unordered_map<int, char> map1;
    unordered_map<int, char>::iterator cursor;
    map1[1] = 'a';
    map1[2] = 'b';
    auto len = map1.equal_range(1);
    for (auto m = len.first; m != len.second; m++)
    {
        cout << "Key : " << m->first << endl;
        cout << "Value : " << m->second << endl;
    }
}

请看下面的输出:

oequal_range

本教程就到此为止。

推荐文章

C++中的集合

C++中的对

C++中的堆栈

C++中的列表

矢量在C++中的应用