• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 311, comments - 0, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

              關系數(shù)據(jù)庫,科學計算應用以及基于Web的系統(tǒng)常常需要類似 vector 的容器,其索引可以是如何數(shù)據(jù)類型,不一定是整數(shù)。這樣的容器叫關聯(lián)容器,或者 map。例如,目錄服務應用可以將私人姓名作為索引來存儲,電話號碼作為其關聯(lián)的值:

            directory["Harry"]=8225687;// 插入 "Harry" 并與他的電話號碼關聯(lián)
            iterator it=directory.find("Harry");// 獲取 Harry 的電話號碼


              其它關聯(lián)容器的應用還包括將 URLs 映射到 IP 的 DNS 服務器,字典,庫存清單,工資表等等。那么如何突破整型索引的局限,實現(xiàn)用其它數(shù)據(jù)類型作為索引的關聯(lián)容器呢?答案是:使用 <map> 庫創(chuàng)建和處理關聯(lián)容器。

            Pair 和 Map
              最近的一篇文章中,我介紹了 tuple 的概念,它是不同類型元素的集合。在這篇文章中,有一個內(nèi)容沒有提到,那就是 C++98 標準庫已經(jīng)具備一個特殊的 tuple 類型——pair。它將鍵值(也就是第一個元素)與某個值(第二個值)關聯(lián)。例如:

            #include <utility> //definition of pair
            #include <string>
            pair <string, string> prof_and_course("Jones", "Syntax");
            pair <int, string> symbolic_const (0, "false");


            標準庫還定義了一個輔助函數(shù),方便 pair 類型的創(chuàng)建:

            string prof;
            string course;
            make_pair(prof,course);//returns pair <string,string>


            第一步:構造和初始化一個 map 對象
              假設你正在開發(fā)一個地址簿程序,地址簿包含姓名和 e-mail 地址。類模板 map 在 <map> 中定義i,它是一個使用類型對的關聯(lián)容器,第一個元素是索引,第二個元素是關聯(lián)的值。使用方法如下:

            #include <map>
            map 
            <stringstring> addresses;


            為了添加元素,使用下標算符:

            addresses["Paul W."]="paul@mail.com";


              這里,串“Paul W.”是索引或鍵值,“paul@mail.com”是其關聯(lián)的值。如果該 map 已經(jīng)包含了此鍵值,那么當前所關聯(lián)的值不會改變: 

            addresses["Paul W."]= "newaddr@com.net"// 不起作用???我測試起作用



            第二步:搜索
              在不插入元素的情況下,如果你想檢查某個元素是否存在,可以使用 find()成員函數(shù)。find()有兩個重載的版本:

            iterator find(const key_type& k);
            const_iterator find(
            const key_type& k) const;



            通常,用 typedef 可以使代碼更可讀一些:

            typedef map <stringstring>::const_iterator CIT;
            CIT cit
            =addresses.find("Paul W.");
            if (cit==addresses.end())
            cout 
            << "sorry, no such key" << endl;
            else
            cout 
            << cit->first << ''\t'' << cit->second << endl;



            表達式中 cit->first 和 cit->second 分別返回鍵值及其關聯(lián)的值。

            第三步:元素遍歷
              現(xiàn)在讓我們看一個更現(xiàn)實的情況。假設你正在經(jīng)營一家旅行社,每一個代理做一單業(yè)務都可以獲得獎金。這些代理的信息存儲在某個文件中,其格式如下:

            Bob 35
            Bob 90
            Jane 80.25
            Sue 100
            Jane 65.5
              你的應用程序必須匯總所有代理的獎金并將每個代理的獎金總數(shù)顯示出來.首先,創(chuàng)建一個 map,然后讀取該數(shù)據(jù)文件:

             

            map <stringdouble> bonuses;
            string agent;
            double bonus=0;
            ifstream bonusfile(
            "bonuses.dat");
            if(!bonusfile)
            {
            // 報告出錯信息并終止程序
            }
            while (bonusfile >> agent >> bonus)
            {
            bonuses[agent]
            +=bonus;// 累加每個代理的獎金
            }


              不管理相不相信,就這么簡單!且讓我們來分析一下該循環(huán)。打開數(shù)據(jù)文件之后,while 循環(huán)讀取每個值對,并將其存入 agent 和 bouns 對象。接著,它將 agent 和 bouns 插入到該 map。此處的關鍵技巧是:如果鍵值(agent)已經(jīng)存在,那么 += 操作符便將最新讀取的 bouns 累加到存儲在 map 中當前的 bouns 中。因為表達式:

            map[key]
              返回與鍵值關聯(lián)的值。當重載的 += 操作符被調用時,該值便被累加到新讀取的 bouns 中。最后累加的和覆蓋 map 中舊的關聯(lián)值。記住:當你使用下標算符機制時,純粹的賦值操作并不會改寫現(xiàn)有的值,只有重載的 += 才這么做。

            幸運的是,map 并不包含一個必須要初始化的鍵值,表達式:

            map[key]
              返回默認的初始化 T,而 T 在上述例子中是 double 類型。默認的初始值為 0。至此,map 包含代理及其獎金匯總值對。下面的循環(huán)用來顯示這些值對,輸出如圖一所示:

             

            for(CIT p=bonuses.begin(); p!=bonuses.end(); ++p)
            {
            cout << p->first <<''\t'' << p->second <<endl;
            }

             


            散列的關聯(lián)容器
              標準庫目前還不提供散列關聯(lián)容器。這種容器可以大大改進性能,因為它們使用散列算法從原來的字符串索引派生短鍵值。但是,許多 IDEs 提供非標準散列容器擴展。值得慶幸的是,新的 C++0X 標準彌補了這一點,在 C++ 中添加了一組散列容器和與之相關的算法。


                //定義
                pair<intstring> ming(1,"ming1");
                map
            <int ,string> authors;
                
            //插入
                authors.insert(ming);
                authors.insert(map
            <intstring>::value_type(2,"ming2"));
                authors.insert(make_pair(
            3,"ming3"));
                
            //修改
                cout << "before changed " << authors[3<< endl;
                authors[
            3= "ming4";
                cout 
            <<" after changed "  << authors[3<< endl;
                
            //刪除
                cout <<" before erase "  << authors[2<< endl;
                map
            <intstring>::iterator iter = authors.find(2);
                
            if(iter != authors.end())
                {
                    authors.erase(iter);
                }    
                cout 
            <<" after changed "  << authors[2<< endl;

            輸出:

            before changed ming3
             after changed ming4
             before erase ming2
             after changed

                //刪除指針
                map<string, test4*> pointerMap;
                pointerMap.insert(make_pair(
            "1"new test4()));
                std::map
            <string, test4*>::iterator iter1;
                 
            for (iter1 = pointerMap.begin(); iter1 != pointerMap.end();++iter1)
                 {
                     delete  iter1
            ->second;
                 }


            伊人久久精品线影院| 99久久99久久精品国产片果冻| 韩国免费A级毛片久久| www性久久久com| 久久无码一区二区三区少妇| 久久99毛片免费观看不卡| 国产一区二区精品久久凹凸| 久久久久久亚洲精品影院| 精品久久久久久国产潘金莲 | 欧美激情精品久久久久久久| 亚洲国产精品无码久久久不卡 | 亚洲精品乱码久久久久久| 天天爽天天爽天天片a久久网| 狠狠色丁香婷婷久久综合五月| 热久久这里只有精品| 色欲综合久久中文字幕网| 久久久这里有精品| 久久www免费人成看国产片| 国产精品福利一区二区久久| 久久久久久久久久久精品尤物| 久久99精品久久久久久不卡| 国产亚洲美女精品久久久久狼| 丁香色欲久久久久久综合网| 伊人色综合久久天天网| 久久精品国产一区二区三区不卡| 久久久久AV综合网成人| 99久久做夜夜爱天天做精品| 色婷婷综合久久久久中文字幕 | 久久婷婷综合中文字幕| 亚洲AV无码一区东京热久久| 热久久视久久精品18| 久久久精品国产| 久久婷婷五月综合色奶水99啪| 久久伊人亚洲AV无码网站| 久久影视综合亚洲| 伊人久久五月天| 伊人久久无码中文字幕| 午夜精品久久久久久毛片| 亚洲AV日韩精品久久久久久| 无码人妻久久一区二区三区免费 | 国产精品成人99久久久久 |