map和unordered_map
1.マップ
mapは、任意の基本タイプ(STLコンテナーを含む)を任意の基本タイプ(ST1コンテナーを含む)にマップでき、マップはキーの小さいものから大きいものへと自動的にソートされます。
#include<iostram>
#include<map>
using namespace std;
int main()
{
map<char,int> mp;
mp['m']=20;
mp['r']=30;
mp['a']=40;
for(map<char,int>::iterator it=mp.begin();it!=mp.end();it++)
cout<<it->first<<' '<<it->second<<endl;
return 0;
}
//输出时,map会以键从小到大的顺序自动排序
a 40
m 20
r 30
ヘッダーファイルと定義
#include<map>
//字符串到整型的映射,必须使用string不能使用char数组。
//因为char数组作为数组是不能被作为键值的
map<typename1,typename2> mp;
//typename1为映射前的类型(键),typename2为映射后的类型(值)
要素へのアクセス
(1)map <char、int> mpとして定義されたマップの場合、mp['c']を使用して直接アクセスできます。
(2)イテレータを介したアクセス
//可以使用it->first来访问键,it->second来访问值
map<typename1,typename2>::iterator it;
基本操作
mp.find(key) //返回键为key的映射的迭代器
mp.erase(it) //it为需要删除的元素的迭代器
//例子
map<char,int>::iterator it=mp.find('b');
mp.erase(it);
mp.erase(key) //key为欲删除的映射的键
mp.erase(first,last)
mp.size() //获取mp中映射的对数
mp.clear() //用来清空m中的所有元素
使用する
(1)文字列と
整数の間の
マッピングを確立する
注:マップのキーと値は一意です。キーが複数の値に対応する必要がある場合は、マルチマップのみを使用できます。
2. unordered_map
ヘッダーファイルと定義
#include<unordered_map>
unordered_map<int,int> hashmap;
基本操作
find() 查找与指定键匹配的元素。
end() 刚超出序列末尾的位置
begin() 指定受控序列或存储桶的开头。
clear() 删除所有元素。
count(key) 查找与指定键匹配的元素数。
empty() 测试元素是否存在。
size() 对元素数进行计数。
移除指定位置处的元素。
iterator erase(const_iterator Where);
iterator erase(const_iterator First, const_iterator Last);
size_type erase(const key_type& Key);
使用例
for (Mymap::const_iterator it = c1.begin();it != c1.end(); ++it)
cout << " [" << it->first << ", " << it->second << "]";
3.同じ
map
そして、unordered_map
これらの2つのディクショナリ構造は、キーと値のペアを介してデータを格納し、キーと値のデータ型は異なる場合があります。そして、それらのキーはユニークです。
4.異なる
ヘッドファイル
#include<map>
#include<unordered_map>
実装されたデータ構造
- マップは赤黒木構造に基づいて実装されているため、マップ内の要素は順番に配置されます。マップの追加、削除、変更、およびチェックの時間計算量はO(logn)です。ここで、nは赤黒木の高さです。
- unordered_mapは、ハッシュテーブル(ハッシュテーブルとも呼ばれます)に基づいています。ハッシュテーブルは、O(1)に近いunordered_mapの挿入とルックアップを行います(衝突がない場合)が、その内部要素は順序付けられていません。
保管所
unordered_mapのハッシュスペースには未使用の場所がいくつかあるため、メモリ効率は100%ではありません。マップの赤黒木のメモリ効率は100%に近いです。
パフォーマンスの安定性を見つける
マップの検索は平衡二分木の検索に似ており、そのパフォーマンスは非常に安定しています。たとえば、1Mデータの要素を見つけるには何回の比較が必要ですか?20回。マップルックアップの数は、保存されているデータの分布とサイズにほとんど依存しません。unordered_mapはハッシュテーブルに依存しています。ハッシュ関数によってマップされたキー間の衝突が多すぎる場合、最悪の時間計算量はO(n)になる可能性があります。したがって、unordered_mapの検索回数は、保存されているデータの分布とサイズに密接に関係しており、その効率は不安定です。
使用するシーン
マップ要素は順序付けられており、パフォーマンスは比較的安定しています。これは、順序付けが必要な要素、または単一のクエリの時間に敏感な要素に適しており、リアルタイムアプリケーションなど、クエリのパフォーマンスの安定性を維持する必要があります。
unordered_mapのクエリ速度はO(1)の速度ですが、要素は順序付けられておらず、クエリのパフォーマンスは不安定です(最悪の場合はO(n)です)。これは、クエリの速度を速くし、単一のクエリのパフォーマンス要件に影響されないようにするのに適しています。
总结
:要素の順序付けが必要な場合、または単一のクエリのパフォーマンス要件がより敏感な場合はmapを使用し、それ以外の場合はunordered_mapを使用する必要があります。アルゴリズムプログラミングのほとんどの場合、mapの代わりにunordered_mapを使用する必要があります。