(LeetCode 1とhsahmapアルゴリズムの問題を含む)C ++地図使用法レコード

C ++地図の使い方

ネットワークからの記事の数は、侵害あれば、ご連絡ください。

1、マップ機能

マップは、ハッシュのいずれかを提供する連想コンテナSTL、です。
最初は、キー(鍵)を呼び出すことができ、各キーワードは、専用マップに一度表示されることがあり、
第二は、キーワード(値)の値と呼ばれることができ、
キーと値は、必要な任意のタイプにすることができます。

2、マップを使用して

クラスマップヘッダーファイルを含める得るためにマップを使用し

#含める //注意,STL头文件没有扩展名.h

マップオブジェクトは、テンプレートクラスであるあなたは、キーワードを保存する必要があり、2つのテンプレートパラメータオブジェクト:

STD:マップ<整数、文字列>人員;

これは、インデックスとしてint型のポインタを定義し、点の関連付けられた文字列を有しています。

3、地図コンストラクタ

6つのマップコンストラクタの合計を提供し、これは次のようにメモリアロケータのものではなく、スキップ表に関し、我々は言って、ここで、マップのコンストラクタの一部と接触する以下のように我々は通常の方法によって構築ということですマップ:

マップ<整数、文字列> mapStudent。

図4に示すように、インサート要素

// 定义一个map对象
map<int, string> mapStudent;
 
// 第一种 用insert函數插入pair
mapStudent.insert(pair<int, string>(000, "student_zero"));
 
// 第二种 用insert函数插入value_type数据
mapStudent.insert(map<int, string>::value_type(001, "student_one"));
 
// 第三种 用"array"方式插入
mapStudent[123] = "student_first";
mapStudent[456] = "student_second";

機能インサート挿入データは、データの挿入を伴うと、データが挿入されているがこれら三つの使用量は、実施されてもよいが、それらは異なっていて、当然のことながら、第一および第二の効果は同じで行われます概念セット、キーワードがマップに存在する場合、すなわち、挿入操作がデータに挿入するが、アレイにより異なるされていない、それは前のキーワードに対応する値を上書きすることができ、プログラムの一意性を次のように

mapStudent.insert(map<int, string>::value_type (001, "student_one"));
 
mapStudent.insert(map<int, string>::value_type (001, "student_two"));

上記のこれらの二つの文を実行した後、マップ001に対応するキーワード値は「student_one」、2番目のステートメントは力ではない、それは我々が成功した問題の挿入INSERT文は、あなたがペアを使用することができるかどうかを知る方法に来ます次のように成功に差し込ま取得する、プログラムがあります

// 构造定义,返回一个pair对象
pair<iterator,bool> insert (const value_type& val);
 
pair<map<int, string>::iterator, bool> Insert_Pair;
 
Insert_Pair = mapStudent.insert(map<int, string>::value_type (001, "student_one"));
 
if(!Insert_Pair.second)
    cout << ""Error insert new element" << endl;

私たちは、あなたが成功したInsert_Pair.secondを挿入している場合はtrueである必要があり、その最初の変数は、マップのイテレータを返し、変数の第二の対が成功を挿入されて知るようになった、とそうでない場合はfalse。

5、要素を見つけます

探しているときにするときのキーのキーが表示され、そのオブジェクトのデータの位置を返します。場所そうでない場合、機能は同じエンドITER値を返します。

// find 返回迭代器指向当前查找元素的位置否则返回map::end()位置
iter = mapStudent.find("123");//查找key,返回位置
 
if(iter != mapStudent.end())
       cout<<"Find, the value is"<<iter->second<<endl;
else
   cout<<"Do not Find"<<endl;

6、削除および空要素

//迭代器刪除
iter = mapStudent.find("123");
mapStudent.erase(iter);
 
//用关键字刪除
int n = mapStudent.erase("123"); //如果刪除了會返回1,否則返回0
 
//用迭代器范围刪除 : 把整个map清空
mapStudent.erase(mapStudent.begin(), mapStudent.end());
//等同于mapStudent.clear()

7、基本的な操作機能をマッピングします。

 C++ maps是一种关联式容器,包含“关键字/值”对

 begin()         返回指向map头部的迭代器

 clear()        删除所有元素

 count()         返回指定元素出现的次数

 empty()         如果map为空则返回true

 end()           返回指向map末尾的迭代器

 equal_range()   返回特殊条目的迭代器对

 erase()         删除一个元素

 find()          查找一个元素

 get_allocator() 返回map的配置器

 insert()        插入元素

 key_comp()      返回比较元素key的函数

 lower_bound()   返回键值>=给定元素的第一个位置

 max_size()      返回可以容纳的最大元素个数

 rbegin()        返回一个指向map尾部的逆向迭代器

 rend()          返回一个指向map头部的逆向迭代器

 size()          返回map中元素的个数

 swap()           交换两个map

 upper_bound()    返回键值>给定元素的第一个位置

 value_comp()     返回比较元素value的函数

map.containsKeyで8、C ++の使用

containsKeyは、マップ内のメソッドで、キーパラメータ、falseを返す場合があり、そこにある場合はtrueマップリターンのリターンキーの存在を検出する役割です。containsKey()及び(GET)パラメータとして最初のキー値で与えられ、その後、2番目の項目に戻ります。

ヒント:
地図設定された許容値がnullで、その数に制限はありませんオブジェクト戻り値がnullのget()メソッドであるとき、2例があるかもしれない、1は、コレクション内の重要なオブジェクトではありません、他のISオブジェクトは、すなわち、オブジェクトの値がヌルである、オブジェクトの任意のキー値にマップされていません。このように、1が設定されてはならないマップget()メソッドは、キーが存在するかどうかを判断するが、判断するためのcontainsKey()メソッドを使用する必要があります。

9、ハッシュマップの使用状況---- LeetCodeアルゴリズム1タイトル

ベースハッシュテーブル(ハッシュテーブル)hash_map。最大の利点のハッシュテーブルは、大幅にほぼ一定の時間として、見つけるために、消費するデータストレージと時間を削減することである。しかし、コストはちょうどより多くのメモリ消費量です。しかし、利用可能な電流より多くのメモリに、時間的なアプローチのためのスペースを使用することは価値があります。また、コードも簡単に、その機能の一つです。

基本的な原理は、比較的広い範囲のインデックス配列の使用は、要素を格納します。あなたは、単位素子を格納するために、この配列を使用して、その後、これ関数値(即ち、標準アレイ、ハッシュ値)と各要素のキー対応していること、(また、ハッシュ関数と呼ばれるハッシュ関数)関数を設計することができます。キーワードによって各要素について、単純に「カテゴリ」を理解し、「タイプ」と呼ばバレルに対応する対応する要素に格納されてもよいです。

しかし、各要素のキーワード関数値が1個であるので、最も可能性の高い様々な要素のために起こるが、換言すれば、このように「衝突」を作成、同じ関数値を算出することを保証することはできません、それは自宅で同じ「クラス」でのさまざまな要素を分割することです。全体的に、「直接アドレッシング」と「解決の競合が」ハッシュテーブルの二つの主要な利点です。

hash_map、大容量メモリの第1の割り当て、多くのバレルを形成します。異なるキーマッピング領域へのハッシュ関数の使用(浴槽)が保存されます。ある挿入プロセスは:
キー得た
ハッシュ関数のハッシュ値によって得られた
(一般モジュロバレルのハッシュ値に対して)バケット番号を取得するために
バレル内のキーと値を格納します。

これはプロセス値は、次のとおり
キー与えるために
、ハッシュ関数のハッシュ値によって得られた
(一般モジュロバレルのハッシュ値に対して)バケット番号を取得するために
等しくない、それが見つからない場合はタブと比較キー要素の内部は、に等しい場合に。
記録した値に等しい撮影。

hash_mapは直接、解決の競合をハッシュ関数を生成対処し、比較関数を解きます。各バケット内の唯一の要素は、その後、時間が一つだけの比較を見つけることがあればここでは、見ることができます。バレルは、値の多くでない場合は、多くのクエリは(見つけるときに参照してください)高速になります。

したがって、ユーザに関連付けられたハッシュテーブルを、達成することである:ハッシュと比較関数。これら2つのパラメータは、我々だけでhash_mapパラメータを使用するときに指定する必要があります。

hash_map(size_type n)は、ストレス効率場合、これは設定する必要があります。N hash_map主ハッシュバケット容器の数を設定するために使用されます。バレルのより数、小さな確率ハッシュ関数の衝突、再アプリケーションメモリの小さい確率。大きなnはより高い効率が、より大きなメモリ消費量。

マップを使用する際、hash_mapを必要とすると
全体的に、hash_mapの検索速度が速くマップよりもなりますが、基本速度データとデータサイズの表情、一定のレベルであり、かつスピードマップは、ログ(n)のレベルで検索します。私は必ずしもログ(N)よりも小さい定数だけでなく、時間のかかるハッシュハッシュ関数ません、あなたは効率を考慮すれば、要素は一定の大きさに達した場合は特に、それを理解し、hash_mapを考えます。あなたは、メモリの使用量に特に厳しいプログラムは、可能な限り少ないメモリを消費するようにしたい場合は、それは注意しなければならない、hash_mapは、あなたの被写体が特に長い時間をhash_mapある場合は特に、あなたもそれを制御することはできません、あなたが恥ずかしい行い、hash_mapあり建設が遅いです。

LeetCodeアルゴリズム1タイトル

class Solution {
   public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>((int) ((float) nums.length / 0.75F + 1.0F));
        for (int i = 0; i < nums.length; i++) {
            if (map.containsKey(target - nums[i])) {
                return new int[]{map.get(target - nums[i]), i};
            }
            map.put(nums[i], i);
        }
        throw new IllegalArgumentException("No two sum value");
    }
}
リリース元の2件の記事 ウォンの賞賛0 ビュー106

おすすめ

転載: blog.csdn.net/qq_44310853/article/details/103926318