1. 程式人生 > >set和map的增刪查改

set和map的增刪查改

一,set用法介紹:
set是單詞set(集合)的意思
只有一個鍵值,set當中不能儲存相同的鍵值
所有的元素都會根據元素的鍵值自動被排序。(底層檢索使用中序遍歷演算法)

相關函式:

(1)begin:返回一個迭代器,此迭代器指向set中到的第一個元素。
(2)end:返回一個迭代器,此迭代器指向set最後一個元素的下一個位置。
(3)rbegin:返回一個迭代器,此迭代器指向反向set中的第一個元素。
(4)rend:返回一個迭代器,此迭代器指向反向set中最後一個元素之後的位置。
(5)cbegin:返回一個常量迭代器,此迭代器指向set中到的第一個元素。
(6)cend:返回一個迭代器,此迭代器指向set最後一個元素的下一個位置。 (7)clear:清除set的所有元素。
(8)crbegin:返回一個常量迭代器,此迭代器指向反向set中的第一個元素。
(9)crend:返回一個常量迭代器,此迭代器指向反向set中最後一個元素之後的位置。
(10)find:返回一個迭代器,此迭代器指向set中其鍵與指定鍵相等到的元素的位置。
(11)insert:將元素或元素範圍插入到set中的指定位置。 (12)size:返回set中元素的數量。
(13)swap:交換兩個set的元素。

(1)插入(正向遍歷):
採用insert()方法把元素插入到集合中,一般按元素值從小到大插入。使用前向迭代器對集合中序遍歷,結果正好是元素排序後的結果。

#include<iostream>
#include<set>
using namespace std;
int main()
{
    set<int> s;//建立set集合物件
    s.insert(5);
    s.insert(1);
    s.insert(6);
    s.insert(3);
    s.insert(5);//重複插入5,會失效
    set<int
>
::iterator it;//定義前向迭代器 for(it = s.begin();it!=s.end();it++) { cout<<* it<<" "; } cout<<endl; return 0; }

輸出:1 3 5 6
(2)反向遍歷:
使用反向迭代器reverse_iterator可以反向遍歷集合,輸出的結果正好是集合元素的反向排序結果。它需要用到rbegin()和rend()兩個方法,它們分別給出了反向遍歷的開始位置和結束位置。

#include<iostream>
#include<set> using namespace std; int main() { set<int> s;//建立set集合物件 s.insert(5); s.insert(1); s.insert(6); s.insert(3); s.insert(5);//重複插入5,會失效 set<int>::reverse_iterator rit;//定義反向迭代器 for(rit = s.rbegin();rit!=s.rend();rit++) { cout<<* rit<<" "; } cout<<endl; return 0; }

輸出:6 5 3 1
(3)刪除:

int main()
{
    set<int> T;
    int arr[10]={1,2,3,4,5,6,7};
    T.insert(arr,arr+6);
    cout<<"遍歷T:"<<" ";
    set<int>::iterator it1 = T.begin();
    while(it1 != T.end())
    {
        cout<< *it1<<" ";
        ++it1;
    }
    cout<<endl;
    //(1)刪除一個節點,找到鍵值為2的迭代器
    set<int>::iterator it2 = T.find(2);
    //然後刪除該節點
    T.erase(it2);
    cout<<"刪除節點2:"<<" ";
    it1=T.begin();
    while(it1 != T.end())
    {
        cout<< *it1<<" ";
        ++it1;
    }
    cout<<endl;
    //(2)刪除一個迭代器區間
    it2 = T.find(3);
    T.erase(it2,T.end());
    cout<<"刪除3後面的節點"<<" ";
    it1 = T.begin();
    while(it1 != T.end())
    {
        cout<< *it1<<" ";
        ++it1;
    }
    cout<<endl;
    //(3)刪除set的所有元素
    T.clear();
    cout<<"刪除所有元素:"<<" ";
    it1 = T.begin();
    while(it1 != T.end())
    {
        cout<< *it1<<" ";
        ++it1;
    }
    cout<<endl;
}

這裡寫圖片描述
(4)查詢:
使用find()方法對集合進行檢索,如果找到查詢的鍵值,返回該鍵值的迭代器位置,否則返回集合最後一個元素後面的一個位置,即end()。

int main()
{
    set<int> T;
    int arr[10]={1,2,3,4,5,6,7};
    T.insert(arr,arr+6);
    set<int>::iterator it;
    it = T.find(6); //查詢鍵值為6的元素  
    if(it != T.end())  
        cout << *it << endl;  
    else  
        cout << "not find it" << endl;  
    it = T.find(20); //查詢鍵值為20的元素 
    if(it != T.end())  
        cout << *it << endl;  
    else  
        cout << "not find it" << endl;  
    return 0;  
}  

map用法介紹:
Map是單詞mapping(對映)的縮寫
(1)內部儲存有兩個部分,一個是固定的鍵值,另一個關鍵字是記錄該關鍵字的狀態(大小,翻譯,對應關係等)
(2)由於map容器底層是使用搜索樹來儲存資料的,所以只要資料不能夠相互比較大小就不能使用map儲存。
相關函式

(1)begin:返回一個迭代器,此迭代器指向對映中的第一個元素 (2)end::返回超過迭代器末尾
(3)rbegin:返回一個迭代器,此迭代器指向反向對映中的第一個元素
(4)rend:返回一個迭代器,此迭代器指向反向對映中的最後一個元素之後的位置。
(5)cbegin:返回一個常量迭代器,此迭代器指向對映中的第一個元素。 (6)cend:返回一個超過末尾的常量迭代器。
(7)crbegin:返回一個常量迭代器,此迭代器指向反向對映中的第一個元素。
(8)crend:返回一個常量迭代器,此迭代器指向反向對映中最後一個元素之後的位置。 (9)empty:如果對映為空,則返回true。
(10)size:返回對映中的元素數量。 (11)max_size:返回對映的最大長度。 (12)at:查詢具有指定鍵值的元素。

(13)earse:從指定位置移除對映中的元素或元素範圍。
(14)find:返回一個迭代器,此迭代器指向對映中其鍵值與指定鍵相等的元素的位置。 (15)swap:交換兩個對映的元素。
(16)clear:清除對映的所有元素。
(17)lower_bound:返回一個迭代器,此迭代器指向對映中其鍵值等於或大於指定鍵值的第一個元素。
(18)upper_bound:返回一個迭代器,此迭代器指向對映中其鍵值大於指定鍵值的第一個元素。

(1)訪問:

int main()
{
    map<int,int> T;
    T[0] = 1;
    T[1] = 2;
    T[2] = 3;
    T[3] = 4;
    //cout<<"鍵值為2的元素:"<<endl;
    //cout<<T.at(2)<<endl;//c++11不支援

    cout<<"依次遍歷"<<endl;
    map<int,int>::iterator it=T.begin();//map中第一個元素位置的迭代器
    while(it!=T.end())
    {
        cout<<it->first<<"->"<<it->second<<endl;
        ++it;
    }
    cout<<"find一個元素的迭代器並且訪問它:"<<endl;
    cout<<T.find(3)->first<<"->"<<T.find(3)->second<<endl;   
}  

(2)插入:
這裡寫圖片描述
(a)單個元素的插入:

pair<iterator,bool>insert(const value_type&v)

將元素v(包括鍵值和映照資料)插入map容器,重複的v值不被插入。返回一個pair配對物件。
pair說明:是一個結構體型別,裡面的兩個成員變數的型別可以通過模板給定,在這裡如果插入成功新元素,則pair中的第二個元素為bool,反之為false。
這裡寫圖片描述
(b)給定迭代器位置插入:

iterator insert(iterator position,const value type& v)

將元素v(包括鍵值和映照資料)插入map容器,引數position只是提示可在position位置之前插入v,所以返回的插入位置視情況而定,你一定在position位置前插入。
這裡寫圖片描述
(c)給定迭代器位置插入:

void insert(InputIterator first,InputIterator last)

將迭代器區間[first,last)所指的資料作為容器元素(包括鍵值和對映資料),插入到map容器中。
這裡寫圖片描述

(3)刪除:
這裡寫圖片描述
(a)刪除給定迭代器位置的元素
用erase() 刪除一個元素,傳入刪除元素的迭代器

void erase(iterator opsition);

這裡寫圖片描述
(b)給定K值,進行刪除

size_type erase(const key_type& k);

這裡寫圖片描述
(c)刪除給定範圍的資料

void erase(iterator first,iterator last);

這裡寫圖片描述
(4)查詢:
查詢map中key與要查詢的值相等的元素,返回對應的迭代器
這裡寫圖片描述
這裡寫圖片描述

相同點:底層都是使用紅黑樹構造的,這使得它們的查詢,插入,刪除的效率都非常高,並且它們都是有序的