c++的map竟然是有序的!!!


昨天看了一道題

這道題要我們把單詞排好序輸出,每個單詞后面跟上單詞出現的順序。
由於這段時間在學Go語言,所以我就用Go語言來做了,結果超時了,我當時的思路是這樣的:
用一個map,存單詞和出現次數,用slice存出現過的單詞,輸入完成后對slice進行排序,然后在將map里的內容輸出,為此我還寫了一個比較字符串的函數(有點蠢),這個方法,當然超時了。
之后我不服氣,想着用c++再做一下試試,興許c++性能強,就不會超(eee,這個想法也挺蠢的)結果還是超時,於是我就搜一下這個題,發現有人說c++里的map中的key是有序存放的,所以單詞放進去就是按字典序排的,最后直接迭代就可以!!!!
所以我最后寫出了這樣的代碼

#include<iostream>
#include<iomanip>
#include<cmath>
#include<string>
#include<vector>
#include<map>
#include<stdio.h>

using namespace std;



int com(string a,string b){
    int minlen = a.length()<b.length()? a.length():b.length();
    int i;
    for(i=0;i<minlen;i++){
        if(a[i]!=b[i]){
            return (int)(b[i]-a[i]);
        }
    }
    return b.length()-a.length();
}

int main(){
    int i,j;
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        map<string,int>mymap;
        while(n--){
            string str;
            cin>>str;
            mymap[str]++;
        }
        int nums=mymap.size();
        printf("%d\n",nums);
        map<string,int>::iterator iter;
        for(iter = mymap.begin();iter!=mymap.end();iter++){
            cout<<iter->first<<": "<<iter->second<<endl;
        }
        cout<<endl;
    }

}

由此我又去探究了一下,發現,原來c++里的map相當於Java里的TreeMap,他們都是有序的而而c++中的hash_map和unordered_map是無序的。
Go語言中的map更怪了,遍歷map的時候,它會使用隨機數,所以你拿到的序列是隨機的,要想用Go語言實現這道題的要求,可以轉成切片,然后進行排序,不過呵呵,我用Go寫沒有AC。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM