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_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;
}
请看下面的输出:
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;
}
见下面的输出:
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;
}
见下面的输出:
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;
}
参见下面的输出:
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;
}
请看下面的输出:
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;
}
}
请看下面的输出:
本教程就到此为止。