1. 程式人生 > >STL map(圖) C++

STL map(圖) C++

標頭檔案:#include<map> //按照鍵值預設已經排好序(升序)

map的功能:建立key和value的對應,可以通過key來唯一查詢value,查詢的時間複雜度為O(logn);

在map中key置是唯一的不可以被修改,而value可以被修改。

定義:map<key型別,value型別> 變數名;key和value的型別可自定義;

例如:map<key,value> M;

常用方法(加粗為常用方法):

兩個正向迭代器(iterator):begin()和end()

兩個反向迭代器(iterator):rbegin()和rend()

插入資料:insert();//    insert(pair<與map中的定義一致>(資料))   名稱空間std

                                    insert(map<key,value>::value_type(資料));

map的大小:size();//返回一個整型數,代表內元素的個數;

查詢資料:count(key);//由於map的特性,返回值為0或1;用於返回指定key值出現的次數;

                find(key);   //返回值為迭代器(iterator)型別;

刪除資料:erase();//可以根據key值進行刪除,或者知道某個迭代器的位置進行刪除;

                             //也可以進行區間刪除,erase(iterator fir,iterator last);

清空:clear();//相當於erase(map.begin(),map.end());

交換:swap();//同list與vector,交換map中所有的元素;

lower_bound();//返回鍵值key可以插入的位置的第一個位置(iterator);//採用二分查詢方式

upper_bound();//返回鍵值key可以插入的最後一個位置(iterator);

資料結構實驗之查詢三:樹的種類統計

Time Limit: 400 ms Memory Limit: 65536 KiB

Problem Description

隨著衛星成像技術的應用,自然資源研究機構可以識別每一個棵樹的種類。請編寫程式幫助研究人員統計每種樹的數量,計算每種樹佔總數的百分比。

Input

輸入一組測試資料。資料的第1行給出一個正整數N (n <= 100000),N表示樹的數量;隨後N行,每行給出衛星觀測到的一棵樹的種類名稱,樹的名稱是一個不超過20個字元的字串,字串由英文字母和空格組成,不區分大小寫。

Output

按字典序輸出各種樹的種類名稱和它佔的百分比,中間以空格間隔,小數點後保留兩位小數。

Sample Input

2
This is an Appletree
this is an appletree

Sample Output

this is an appletree 100.00%

#include<map>
#include<stdio.h>
#include<string>
#include<iostream>
#define N 25
using namespace std;
char s[N];
int rear = 0;
int main()
{
    int n;
    map<string, int> M;
    scanf("%d", &n);
    getchar();//吸收回車
    for(int i = 0; i < n; i++)
    {
        char c;
        c = getchar();
        while(c != '\n')
        {
            if(c >= 'A' && c <= 'Z')
            {
                c = c + 32;//大小寫轉化 
            }
            s[rear++] = c;
            c = getchar();
        }
        s[rear] = '\0';
        rear = 0;
        if(M.find(s) == M.end())
        {
            M.insert(pair<string, int>(s, 1));
        }
        else
        {
            M[s]++;
        }
    }
    for(map<string, int>::iterator it = M.begin(); it != M.end(); it++)
    {
        cout << it->first;
        int num= it->second; 
        double output =  (double)num / n;
        printf(" %.2lf%%\n", 100 * output);
    }
    M.clear();
    return 0;
}