C++ STL之map map介紹 C++里的map數據結構,會存儲鍵值對信息key value,通過key得到value的信息。map的key與value有一個特點就是:每個唯一的key擁有唯一對應的value,不會出現多組value與之對應。 它和其他標準模板容器不同的是,初始化它的時候要提供兩 ...
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];
}
}
註意點如下詳細解釋:
- 在對字元串進行標準化的時候,註意必須要對ans進行初始化。如這樣
string ans;
是不行的。另外c++中的string真的是一等公民,既可以用下標對每一個字元進行賦值,也可以把整個字元串進行賦值,非常方便。 - sort函數輸入兩個參數,起始位置。但是它並不會返回什麼的,不要以為它會返回數組的begin位置。
- 第三個註意點,我們這裡使用的是
cnt.count(r)
,count函數只有兩個返回值(0 or 1)。如果map中有這個key,那麼count就返回1,沒有那麼就返回0。在這裡if裡面的判斷條件可以用!cnt[r]
來替換,因為如果map中沒有這個key,通過[ ]讀取,它的返回值是0。所以它們的效果等同。