1. 程式人生 > >c++ STL 映射:map

c++ STL 映射:map

char 意義 out 字典序排序 IT 清空 平衡 push_back sample

Map是STL的一個關聯容器,它提供一對一(其中第一個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的數據 處理能力,由於這個特性,它完成有可能在我們處理一對一數據的時候,在編程上提供快速通道。這裏說下map內部數據的組織,map內部自建一顆紅黑樹(一 種非嚴格意義上的平衡二叉樹),這顆樹具有對數據自動排序的功能,所以在map內部所有的數據都是有序的。

功能:建立key-value的映射 key與value是任何你需要的類型 exp:map<char,int> a 建立一個char到int的映射a。

常用語句:begin()返回map頭部叠代器

end()返回尾部叠代器

clear()清空所有元素

erase()刪除一個元素

find()查找一個元素

empty()如果為空則返回true

size()返回map大小

count(elem)返回某個元素個數

例題:UVa 156 -反片語

大意是給你幾串字符串 求出自身字符隨意組合後不會出現在這些字符串裏面的字符串 按字典序排序。

Sample input

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

Sample output

Disk
NotE
derail
drIed
eye
ladder
soon

分析


這道題的解法很多,最簡化的方式就是使用map容器。想到使用“標準化”。
整體思路:
1.寫一個標準化函數(實現大寫字母轉換為小寫(tolower()函數),單詞排序。註意使用const是為了不改變s的初值)
2.兩個vector容器(words,ans),一個map容器(cnt)
words存儲所有的單詞
map存儲標準化後對應單詞以及出現次數的值,相當於一個表格。
words經過查表map,把對應的符合值給ans
感覺初次寫map還是挺爽的...

#include<iostream>
#include<map>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
map<string,int>mmap;
vector<string> str;


string standard(const string &s)
{
string t=s;
for(int i=0;i<s.size();i++)
{
t[i]=tolower(s[i]);//轉換成小寫字母
}
sort(t.begin(),t.end());
return t;
}


int main()
{
string s;
while(cin>>s)
{
if(s[0]==‘#‘)
break;
str.push_back(s);//推入vector
string r=standard(s);//將其標準化

mmap[r]++;
}

vector<string>ans;
for(vector<string>::iterator it=str.begin();it!=str.end();it++)
{
if(mmap[standard(*it)]==1)
ans.push_back(*it);
}

sort(ans.begin(),ans.end());
for(vector<string>::iterator it=ans.begin();it!=ans.end();it++)
{
cout<<*it<<endl;
}


return 0;
}

c++ STL 映射:map