【C++STL】細数C++STLのこと---map容器

9076 ワード

MAP容器
1)概念:mapは、データを格納し、1つのデータセットからデータを取り出すためのコンテナである.そのデータ構成には、データ値とソート用のキーワードの2つの項目が含まれています.キーワードは唯一で、データを自動的にソートするために使用されます.各要素のデータ値はキーワードに関係なく、直接変更できます.
         
【ポイント】内部構造はRB_を採用TREE(赤黒樹).検索の複雑さ:O(log 2 N)
        
Multimapはmapと同じ特性で、唯一の違いはキー値の繰り返しを許可することです!!!
2)使用
ロードするヘッダファイル:#includeusing namespace std;テンプレートプロトタイプ:template,//mapコンテナ内の相対的な位置を決定するために、2つの要素を比較するキーワードを提供します.オプションです.デフォルト値はlessclass Allocator=allocator//がストレージ管理デバイスを表します.オプションです.デフォルト値はallocator>3)mapコンテナの特徴です.(1)キーワードに基づいてデータの読み取り能力を向上させる関連コンテナです.(2)データを読み書きするための双方向のロケータを提供する.(3)キーワードと比較関数に基づいて順序を並べた.(4)各要素のキーワードは唯一である.(5)は、一般的で独立したデータ型を提供するテンプレートです.
4)mapに関する最も詳しい紹介は資源を参照
STL MAP詳細リソースダウンロード
5)map法と組み合わせて、総合的なテストコードを提供した.
#include <cstdlib>
#include <map>
#include <iostream>
using namespace std;

map <int,char> ctr;

int print_one_item(map <int,char>::const_iterator cp)//     map      
{
        cout<<"("<<cp->first<<" , "<<cp->second<<") ";
        
        return 0;
}

void test_equal_range()//  equal_range()   
{
    //pair                           
    //pair                      。

    pair <map <int,char>::const_iterator, map <int,char>::const_iterator> p;
    
    p=ctr.equal_range(2);

    if(p.first!=ctr.end())
    {
        cout<<"The first element which key >= 2 is: ";
        //cout<<"("<<p.first->first<<" , "<<p.first->second<<") ";
        print_one_item(p.first); //          
        cout<<endl;
    }
   if(p.second!=ctr.end())
   {
        cout<<"The first element which key > 2 is: ";
        cout<<"("<<p.second->first<<" , "<<p.second->second<<") ";
        cout<<endl;
    }
    
}

void creat_map()
{
      ctr.insert(pair <int,char>(1,'a'));
      ctr.insert(pair <int,char>(2,'b'));
      ctr.insert(pair <int,char>(3,'b'));
      ctr.insert(pair <int,char>(4,'c'));
      ctr.insert(pair <int,char>(5,'d'));
      ctr.insert(pair <int,char>(1,'c'));
}

void erase_map()//       
{
    map <int,char>::iterator cp=ctr.find(2);
    ctr.erase(cp);//        2    
}

void clear_map()
{
      ctr.clear();//   map   (      )
      if(ctr.empty())//map      
        cout<<"The container is empty"<<endl;
      else
        cout<<"The container is not empty"<<endl;
}

int print()//       map   
{
        map<int,char>::const_iterator cp;
        for(cp=ctr.begin();cp!=ctr.end();cp++)//  cp   c          cp     
                print_one_item(cp); //            

        return 0;
}

void print_first_element()
{
      map <int,char>::iterator cp;//   
      cp=ctr.begin(); //    ctr      
      cout<<"The first element is:"<<cp->second<<endl;//        
}
void key_compare_map() //key_comp              map           。
{
      map <int,int> c;
      map <int, int, less<int> >::key_compare kc = c.key_comp() ;
        if(kc( 1, 2 ))
                cout<<"kc(1,2) is true"<<endl;
        else
                cout<<"kc(1,2) is false"<<endl;

      if(kc( 2, 1 ))
                cout<<"kc(2,1) is true"<<endl;
        else
                cout<<"kc(2,1) is false"<<endl;
}
void lower_bound_map()
{
    map <int,char>::iterator cp;
   /*                                ,       map  
              
    */
    cp=ctr.lower_bound(2);//          2       

    if(cp!=ctr.end())
    {
        cout<<"The first element which key >= 2 is: ";
        print_one_item(cp);//          
        cout<<endl;
    }

}

void compare_map()
{
    map <int,char> ctr1,ctr2;
        int i;
        for(i=0;i<3;i++)
        {
                ctr1.insert(pair <int,char>(i,'a'+i));
                ctr2.insert(pair <int,char>(i,'A'+i));
        }
        if(ctr1!=ctr2)//  ctr1   ct2    
                cout<<"They are not equal"<<endl;
        else//  ctr1   ctr2    
                cout<<"They are equal"<<endl;

}
void comp_map()//   map                         。
{              //   map     ,                        
    map <int,char> ctr1,ctr2;
    int i;
    for(i=0;i<3;i++)//    ctr1   ctr2   
    {
        ctr1.insert(pair <int,char>(i,i));
        ctr2.insert(pair <int,char>(i,i+1));
    }
    if(ctr1<ctr2)      
        cout<<"ctr1<ctr2"<<endl;
    else
        cout<<"ctr1>=ctr2"<<endl;       
}

void reverse_map()//      map  rbegin() rend()  reverse_iterator    
{
    map <int,char>::reverse_iterator rcp;
    for(rcp=ctr.rbegin();rcp!=ctr.rend();rcp++)
      cout<<"("<<rcp->first<<" , "<<rcp->second<<") ";

}

void swap_map()
{
    
    map <int,int> ctr1, ctr2;
    map <int,int>::const_iterator cp;
    int i;

    for(i=0;i<3;i++)//     ctr1   ctr2   
    {
        ctr1.insert(pair <int,int>(i,i));
        ctr2.insert(pair <int,int>(i,i+10));
    }
    cout<<"Before exchange with ctr2 the ctr1 is:";
   

    for(cp=ctr1.begin();cp!=ctr1.end();cp++)//  cp   c          cp     
             cout<<"("<<cp->first<<" , "<<cp->second<<") ";
    
    cout<<endl;
    cout<<"After exchange with ctr2 the ctr1 is:";
    ctr1.swap(ctr2);//  ctr1      ctr2   
     for(cp=ctr1.begin();cp!=ctr1.end();cp++)//  cp   c          cp     
             cout<<"("<<cp->first<<" , "<<cp->second<<") ";
    cout<<endl;
}
int main()
{
          
      creat_map();
      int i;
      
      cout<<"1,  begin()"<<endl;
      cout<<"2,  count()       "<<endl;
      cout<<"3,  test_equal_range()"<<endl;
      cout<<"4,  erase()"<<endl;
      cout<<"5,  key_compare_map()"<<endl;
      cout<<"6,  lower_bound_map()"<<endl;
      cout<<"7,  map size  max_size(      )"<<endl;
      cout<<"8,     []    "<<endl;
      cout<<"9,     !=    "<<endl;
      cout<<"10,     <     "<<endl;
      cout<<"11,    map"<<endl;
      cout<<"12,    map   "<<endl;
      while(1)
      {       
      cin>>i;
      
      switch(i)
      {
          case 1: print_first_element(); break;
          case 2: int j;
                  j=ctr.count(1);//       1       (  map           ,      0    1)
                  cout<<"The number of key 1 is: "<<j<<endl;break;
          case 3: test_equal_range(); break;
          case 4: erase_map();break;
          case 5: key_compare_map();break;
          case 6: lower_bound_map();break;
          case 7: cout<<"the size of ctr is:"<<ctr.size()<<endl;
                  cout<<"the max_size of ctr is:"<<ctr.max_size()<<endl;break;
          case 8: cout<<"before change map is:"<<endl;
                  print();
                  ctr[1]='W';//      1       W
                  ctr[7];    //        7   0  
                  cout<<"
after change map is:"<<endl; print();break; case 9:compare_map();break; case 10:comp_map();break; case 11:reverse_map();break; case 12:swap_map(); break; } } map <int,char>::iterator end;// end=ctr.end(); // Map , //end--;// d c cout<<"The last element is:"<<end->second<<endl; clear_map(); return 0; }

もう1つのmapデータ構造の応用(文字列ごとに現れる個数を統計する)を見てみましょう.
#include <iostream>
#include <map>
using namespace std;
int main()
{
	map <string ,int> M;
	map <string ,int>::iterator j;
	string t[5]={"abc","dd","abc","dd","dd"};
	
	for(int i=0;i<5;++i)
		M[t[i]]++;//               
	
	for(j=M.begin();j!=M.end();++j)
		cout<<"<"<<j->first<<" ,"<<j->second<<">"<<endl;
	
	
	return 0;
}