C++におけるmapの基本動作

3658 ワード

1、map概要
mapは関連コンテナです.反復器に対するノードの追加と削除の影響は小さく,その操作ノードを除いて他のノードには影響がないことが特徴である.反復器の場合、keyは変更せずに実値を変更できます.
2、mapの機能
Key-valueの対応を自動的に確立します.keyとvalueは任意に必要なタイプです.
key値に基づいてレコードをすばやく検索すると,検索の複雑さは基本的にLog(N)であり,1000個のレコードがあれば最大10回,1000000個のレコードを検索し,最大20回検索する.
Key-Valueレコードをすばやく挿入します.
レコードをすばやく削除
Keyに従ってvalueレコードを変更します.
すべてのレコードを巡回する.
3、mapを使う
mapを使用してmapクラスが存在するヘッダファイルを含める
#include//STLヘッダファイルには拡張子がありません.h
mapオブジェクトはテンプレートクラスであり、キーワードとストレージオブジェクトの2つのテンプレートパラメータが必要です.

std:map personnel;

これによりintをインデックスとして定義、stringを指すポインタが関連付けられている.
使いやすいようにテンプレートクラスをタイプ定義して、

typedef map UDT_MAP_INT_CSTRING;
UDT_MAP_INT_CSTRING enumMap;

4、mapに要素を挿入する
mapクラスが[]オペレータをリロードしているため、mapのエントリを変更するのは簡単です.

enumMap[1] = "One";
enumMap[2] = "Two";

.....
これは非常に直感的ですが、パフォーマンスの問題があります.2を挿入する場合、まずenumMapでプライマリ・キーが2の項目を検索し、見つからなかった後、新しいオブジェクトをenumMapに挿入し、キーは2で、値は空の文字列で、挿入が完了した後、文字列を「Two」に割り当てます.このメソッドでは、各値をデフォルト値に割り当て、表示される値に割り当てます.要素がクラスオブジェクトの場合、オーバーヘッドが大きくなります.コストを回避するには、次の方法を使用します.

enumMap.insert(map :: value_type(2, "Two"))

5、mapの要素を検索して取得する
下付きオペレータは、値を取得する最も簡単な方法を示します.

CString tmp = enumMap[2];

ただし、mapにこのキーのインスタンスがある場合にのみ正しいです.そうしないと、初期化値の値を持つインスタンスが自動的に挿入されます.
Find()とCount()法を用いて,キーが存在するかどうかを発見できた.
検索mapにキーワードエントリがfind()メソッドで含むかどうか、入力パラメータは検索するkeyであり、ここではbegin()とend()の2つのメンバーに言及する必要があり、mapオブジェクトの最初のエントリと最後のエントリをそれぞれ表し、この2つのデータのタイプはiteratorである.

int nFindKey = 2; //    Key
//        (     )
UDT_MAP_INT_CSTRING::iterator it= enumMap.find(nFindKey);
if(it == enumMap.end()) {
//   
}
else {
//  
}

mapオブジェクトの方法で取得されたiteratorデータ型はstd::pairオブジェクトで、2つのデータiterator->firstとiterator->secondがそれぞれキーワードと格納されたデータを表す
6、mapから要素を削除する
mapのエントリを削除するにはerase()
このメンバーメソッドの定義は次のとおりです.

iterator erase(iterator it); //           
iterator erase(iterator first, iterator last); //       
size_type erase(const Key& key); //        
clear()     enumMap.erase(enumMap.begin(), enumMap.end());

7、mapの基本操作関数:
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()を返します.2つのmap upperを交換します.bound()戻りキー値>指定した要素の最初の位置value_comp()は比較要素valueの関数を返します
例:

//  :
map::iterator iter;
 for(iter = m_AgentClients.begin(); iter != m_AgentClients.end(); ++iter)
 {
  if(iter->first=="8001" {
    this->SendMsg(iter->second.pSocket,strMsg);//iter->first
  }
 }
//  :
map::iterator iter=m_AgentClients.find(strAgentName);
 if(iter!=m_AgentClients.end())//     {
 }
 else //  {
 }
//     
if (m_AgentClients.size()==0)
//  
map::iterator iter=m_AgentClients.find(pSocket->GetName());
 if(iter!=m_AgentClients.end())
 {
   m_AgentClients.erase(iter);//    
 }

以上述べたのは編集者が皆さんに紹介したC++中mapの基本的な操作で、皆さんに役に立つことを望んでいます.もし皆さんが何か疑問があれば、私にメッセージを送ってください.編集者はすぐに皆さんに返事します.