map和string的基本用法


個人網站http://www.ravedonut.com/

因為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;
}

 


免責聲明!

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



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