C++ map練習


C++ STL之map

map介紹

C++里的map數據結構,會存儲鍵值對信息key-value,通過key得到value的信息。map的key與value有一個特點就是:每個唯一的key擁有唯一對應的value,不會出現多組value與之對應。

它和其他標准模板容器不同的是,初始化它的時候要提供兩個數據類型。

比如:

map<string,int> dict;

前面一個string是key的數據類型,后者int為value的數據類型。

它的操作和屬性和常見的容器差不多,像empty()、size()、begin()......

這里需要重點提一下的是它的插入操作。

map的所有元素都是pair,同時擁有實值(value)和鍵值(key)。pair的第一個元素會被視為鍵值,第二個元素會被視為實值。

 map<int ,string> maplive;

插入操作1

pair<int,string> value(1,"a");maplive.insert(value);

等價於maplive.insert(pair<int,string>(1,"a"));

插入操作2

maplive.insert(map<int,string>::value_type(1,"a"));

插入操作3

maplive[1]="a";//map中最簡單最常用的插入添加!

題目練習

題目描述

輸入一些單詞,找出所有滿足如下條件的單詞:

該單詞不能通過字母重排,得到輸入文本中的另外一個單詞。

在判斷是否滿足條件時,不區分大小寫,但輸出保留輸入中的大小寫,按字典序進行排列(所有大寫字母在小寫字母的前面)

樣例輸入:

ladder came tape soon leader acme RIDE lone Dreis peat
ScALE orb eye Rides dealer NotE derail LaCeS drIed
noel dire Disk mace Rob dires

樣例輸出:

Disk
NotE
derail
drIed
eye
ladder
soon

#define LOCAL
#include<iostream>
#include<map>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

vector<string> words;
map<string,int> cnt;

string repr(const string& str){//standardize
    string ans=str;//!注意點1
    for(int i=0;i<str.length();i++){
        ans[i]=tolower(str[i]);
    }
    sort(ans.begin(),ans.end());//!注意點2
    return ans;
}

int main(){
    #ifdef LOCAL
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
    #endif
    string str;
    while(cin>>str){
        if(str[0]=='#')break;
        words.push_back(str);
        string r=repr(str);
        if(!cnt.count(r)) cnt[r]=0;//!注意點3
        cnt[r]++;
    }
    vector<string>ans;
    //iterate vector words
    for(vector<string>::iterator it=words.begin();it!=words.end();++it){
        if(cnt[repr(*it)]==1) ans.push_back(*it);
    }
    sort(ans.begin(),ans.end());
    for(int i=0;i<ans.size();i++){
        cout<<ans[i];
    }
}

注意點如下詳細解釋:

  1. 在對字符串進行標准化的時候,注意必須要對ans進行初始化。如這樣string ans;是不行的。另外c++中的string真的是一等公民,既可以用下標對每一個字符進行賦值,也可以把整個字符串進行賦值,非常方便。
  2. sort函數輸入兩個參數,起始位置。但是它並不會返回什么的,不要以為它會返回數組的begin位置。
  3. 第三個注意點,我們這里使用的是cnt.count(r),count函數只有兩個返回值(0 or 1)。如果map中有這個key,那么count就返回1,沒有那么就返回0。在這里if里面的判斷條件可以用!cnt[r]來替換,因為如果map中沒有這個key,通過[ ]讀取,它的返回值是0。所以它們的效果等同。


免責聲明!

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



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