因為STL基本的容器用法差不多,只有部分不同,所以在寫的時候也精簡了很多。
Map是STL的一個關聯容器,它提供一對一(其中第一個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的數據處理能力,由於這個特性,它完成有可能在我們處理一對一數據的時候,在編程上提供快速通道。這里說下map內部數據的組織,map內部自建一顆紅黑樹(一種非嚴格意義上的平衡二叉樹),這顆樹具有對數據自動排序的功能
map的基本操作函數:
C++ Maps是一種關聯式容器,包含“關鍵字/值”對
begin() 返回指向map頭部的迭代器
clear() 刪除所有元素
count() 返回指定元素出現的次數
empty() 如果map為空則返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊條目的迭代器對
erase() 刪除一個元素
find() 查找一個元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比較元素key的函數
lower_bound() 返回鍵值>=給定元素的第一個位置
max_size() 返回可以容納的最大元素個數
rbegin() 返回一個指向map尾部的逆向迭代器
rend() 返回一個指向map頭部的逆向迭代器
size() 返回map中元素的個數
swap() 交換兩個map
upper_bound() 返回鍵值>給定元素的第一個位置
value_comp() 返回比較元素value的函數
而關於string的詳細部分可以參考
http://www.cnblogs.com/this-543273659/archive/2011/07/21/2113172.html
#include <iostream> #include <map> #include <string> #include <vector> #include <algorithm> using namespace std; class MyPrint { //仿函數 //仿函數是一個模板類,代替了函數指針 //函數指針始終函數的調用,而仿函數是在編譯時內聯(inline)。 //仿函數之所以采用類的形式,是因為類有繼承機制。 public: void operator()(int elem) const { cout<<elem<<" "; } }; bool isdayu6(int elem) { return elem>6; } int main() { vector<int>v1; for (int i=0;i<10;i++) { v1.push_back(i); } for_each(v1.begin(),v1.end(),MyPrint()); cout<<endl; //STL find 和find_if 用法 vector<int>::iterator iter1; iter1=find(v1.begin(),v1.end(),5); cout<<"找到 5 ?"<<*iter1<<endl; while(1) { iter1=find_if(iter1,v1.end(),isdayu6); if (iter1!= v1.end()) { cout<<*iter1<<" "; iter1++; } else { break; } } cout<<endl; //map是將key/value當作元素進行管理,可以根據key自動排序,但搜尋元素性能比較差 map<float,string>m1; //map<float,string>m1; 第一個參數是元素的key值,第二個則是value。 //注意: key/value必須具有可賦值和可復制 //key必須可以比較 m1[90]="pan"; m1[80]="xu"; //用數組方式插入數據 m1.insert(pair<float,string>(77,"lee")); //用insert函數插入pair數據 m1.insert(map<float,string>::value_type(75,"jia"));//用insert函數插入value_type數據 /* 用insert函數插入數據,在數據的插入上涉及到集合的唯一性這個概念,即當map中有這個關鍵字時, insert操作是插入數據不了的,但是用數組方式就不同了,它可以覆蓋以前該關鍵字對應的值 m1.insert(map<float, string>::value_type (1, “lee”)); m1.insert(map<float, string>::value_type (1, “jia”)); 上面這兩條語句執行后,map中1這個關鍵字對應的值是“lee”,第二條語句並沒有生效 我們怎么知道insert語句是否插入成功的問題了,可以用pair來獲得是否插入成功,程序如下 Pair<map<float, string>::iterator, bool> Insert_Pair; Insert_Pair = m1.insert(map<float, string>::value_type (1, “lee”)); 我們通過pair的第二個變量來知道是否插入成功,它的第一個變量返回的是一個map的迭代器, 如果插入成功的話Insert_Pair.second應該是true的,否則為false */ map<float,string>::iterator ita; int i; for (i=0,ita=m1.begin();ita != m1.end();i++,ita++) { cout<<"m1:"<<ita->first<<" "<<ita->second<<endl; } cout<<"m1的大小:"<<m1.size()<<endl; //大小 cout<<"m1中80的有?個:"<<m1.count(80)<<endl;//找到 key==80的元素個數 map<float,string>::iterator pos; pos =m1.find(90);//返回 key==90的第一個元素,找不到就返回end() cout<<"m1中查找90:"<<pos->first<<" "<<pos->second<<endl; cout<<endl; cout<<"反向迭代器"<<endl; map<float, string>::reverse_iterator iter;//也要使用反向迭代器 for (iter=m1.rbegin();iter != m1.rend();iter++) { cout<<"m1:"<<iter->first<<" "<<iter->second<<endl; } cout<<endl; //字符串連接 string s1="hello"; string s2="world"; string s3=s1+","; //string s4="hello"+",";//錯誤 string s5=s1+","+"world"; //string s6="hello"+","+s2;//錯誤 //+操作符的左右操作數必須有一個是string類型的 string str1("hello"); string str2(str1); cout<<str1<<endl; //int StrSize=str1.size(); cout<<str1.size()<<endl; cout<<str1.empty()<<endl; string str3=str1+str2; cout<<str3<<endl; cout<<endl; #pragma warning (disable:4800) cout<<(bool)isalnum('c')<<endl;//如果c是字母或者數字,則為true cout<<(bool)isalpha('c')<<endl;//如果c是字母,則為true cout<<(bool)iscntrl('c')<<endl;//如果c是控制字符,則為true cout<<(bool)isdigit('c')<<endl;//如果c是數字,則為true cout<<(bool)isgraph('c')<<endl;//如果c不是空格,但可以打印,則為true cout<<(bool)islower('c')<<endl;//如果c是小寫字母,則為true cout<<(bool)isprint('c')<<endl;//如果c是可打印字符,則為true cout<<(bool)ispunct('c')<<endl;//如果c是標點符號,則為true cout<<(bool)isspace('c')<<endl;//如果c是空白字符,則為true cout<<(bool)isupper('c')<<endl;//如果c是大寫字母,則為true cout<<(bool)isxdigit('c')<<endl;//如果c是十六進制數,則為true cout<<(char)tolower('c')<<endl;//如果c為大寫字母,返回其小寫字母,否則直接返回 cout<<(char)toupper('c')<<endl;//如果c為小寫字母,返回其大寫字母,否則直接返回 system("pause"); return 0; }
