C++の知識が少ない-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を使用する必要があります。

おすすめ

転載: blog.csdn.net/qq_45890970/article/details/123955261