C++ STL標準模板庫---set/multiset的概念以及簡單使用

參考連接: C++ STL-Multiset.empty()函數html

2019/8/19 天氣:多雲 ios

set/multiset容器基本概念 ide

set容器基本概念 函數

Set的特性:全部元素都會根據元素的鍵值自動被排序。Set的元素不像map那樣能夠同時擁有實值和鍵值,set的元素便是鍵值又是實值。Set不容許兩個元素有相同的鍵值。不能經過迭代器改變set元素,set的iterator是一種const_iterator. ui

set擁有和list某些相同的性質,當對容器中的元素進行插入操做或者刪除操做的時候,操做以前全部的迭代器,在操做完成以後依然有效,被刪除的那個元素的迭代器必然是一個例外。 this

multiset容器基本概念 spa

multiset特性及用法和set徹底相同,惟一的差異在於它容許鍵值重複。set和multiset的底層實現是紅黑樹,紅黑樹爲平衡二叉樹的一種。 orm

樹的簡單知識: 二叉樹就是任何節點最多隻容許有兩個字節點。分別是左子結點和右子節點。 htm

二叉樹示意圖  二叉搜索樹,是指二叉樹中的節點按照必定的規則進行排序,使得對二叉樹中元素訪問更加高效。二叉搜索樹的放置規則是:任何節點的元素值必定大於其左子樹中的每個節點的元素值,而且小於其右子樹的值。所以從根節點一直向左走,一直到無路可走,即獲得最小值,一直向右走,直至無路可走,可獲得最大值。那麼在兒茶搜索樹中找到最大元素和最小元素是很是簡單的事情。下圖爲二叉搜索樹: 排序

 上面咱們介紹了二叉搜索樹,那麼當一個二叉搜索樹的左子樹和右子樹不平衡的時候,那麼搜索依據上圖表示,搜索9所花費的時間要比搜索17所花費的時間要多,因爲咱們的輸入或者通過咱們插入或者刪除操做,二叉樹失去平衡,形成搜索效率下降。 因此咱們有了一個平衡二叉樹的概念,所謂的平衡不是指的徹底平衡。 

 RB-tree(紅黑樹)爲二叉樹的一種。 

set經常使用API 

set構造函數 

set<T> st;//set默認構造函數:

mulitset<T> mst; //multiset默認構造函數: 

set(const set &st);//拷貝構造函數

 

set賦值操做 

set& operator=(const set &st);//重載等號操做符

swap(st);//交換兩個集合容器

 

set大小操做 

size();//返回容器中元素的數目

empty();//判斷容器是否爲空

 

set插入和刪除操做 

insert(elem);//在容器中插入元素。

clear();//清除全部元素

erase(pos);//刪除pos迭代器所指的元素,返回下一個元素的迭代器。

erase(beg, end);//刪除區間[beg,end)的全部元素 ,返回下一個元素的迭代器。

erase(elem);//刪除容器中值爲elem的元素。

 

set查找操做 

find(key);//查找鍵key是否存在,若存在,返回該鍵的元素的迭代器;若不存在,返回set.end();

count(key);//查找鍵key的元素個數

lower_bound(keyElem);//返回第一個key>=keyElem元素的迭代器。

upper_bound(keyElem);//返回第一個key>keyElem元素的迭代器。

equal_range(keyElem);//返回容器中key與keyElem相等的上下限的兩個迭代器。

 

示例代碼 

#include "stdafx.h"

#include <iostream>

#include <set>

#include <time.h>

#include <string>


using namespace std;


void f_setTest01()

{

    //構造函數

    set<int>st1;

    multiset<int>mst;

    set<int>st(st1);


    //賦值操做

    st = st1;

    st.swap(st1); 


    //set大小操做

    int size = st.size();

    st.empty();


    //插入和刪除操做

    st.insert(100);

    st.insert(200);

    st.insert(300);

    st.insert(400);

    st.insert(500);

    set<int>::iterator it1 = st.erase(st.begin());

    st.erase(++st.begin(), --st.end());

    st.erase(100);

    //st.clear();


    //查找操做

    set<int>::iterator it2 = st.find(500);

    int cot = st.count(500);

    set<int>::iterator it3 = st.lower_bound(500);

    set<int>::iterator it4 = st.upper_bound(500);

    pair<set<int>::iterator, set<int>::iterator> range;

    range = st.equal_range(500);

}


void f_setTest02()

{

    set<int>s;

    pair<set<int>::iterator, bool>ret = s.insert(100);

    if (ret.second)

    {

        cout << "插入成功" << endl;

    }

    else

    {

        cout << "插入失敗" << endl;

    }

}


struct MyCompare

{

    bool operator()(int v1,int v2)

    {

        return v1 > v2; 

    }

};

void f_setTest03()

{

    srand((unsigned int)time(NULL));

    set<int, MyCompare>s;        //set容器的第二個參數模板能夠設置排序規則 默認規則是從小到大

    for (int i = 0; i < 10; i++)

    {

        s.insert(rand() % 100);

    }


    for (set<int, MyCompare>::iterator it = s.begin();it!=s.end();it++)

    {

        cout << *it <<endl;

    }


}


class Person

{

public:

    Person(string name,int age)

    {

        this->nName = name;

        this->mAge = age;

    }

public:

    string nName;

    int mAge;

};


struct MyCompare02

{

    bool operator()(const Person&p1,const Person &p2)

    {

        return p1.mAge > p2.mAge;

    }

};


void f_setTest04()

{

    set<Person, MyCompare02>s;

    Person p1("aaa",20);

    Person p2("bbb",30);

    Person p3("ccc",40);

    Person p4("ddd",50);


    s.insert(p1);

    s.insert(p2);

    s.insert(p3);

    s.insert(p4);


    for (set<Person, MyCompare02>::iterator it = s.begin();it != s.end();it++)

    {

        cout << "Name" << it->nName << "  Age" << it->mAge << endl;

    }


}


void f_pairTest()

{

    //方法1:建立一個對組

    pair<string, int>pair1(string("aaa"),20);

    cout << pair1.first << pair1.second<< endl;


    //方法2:make_pair

    pair<string, int>pair2 = make_pair("bbb",30);

    cout << pair2.first << pair2.second << endl;


    //方法3:pair = 賦值

    pair<string, int>pair3 = pair2;

    cout << pair3.first << pair3.second << endl;


}


/*

    extends the container by inserting new elements,effectively increasing the container size by the number of elements inserted

    擴展容器插入新元素,有效地增長容器大小插入的元素數量

    

    because elements in a set are unique,the insertion operation checks whether each inserted element is equivalent to an element already in the container,and if so,the element is not inserted,returning an iterator to this existing element(if the function returns a value)

    由於在一組元素是獨一無二的,插入操做檢查是否每一個插入的元素已經至關於一個元素的容器,若是是這樣,不是插入的元素,返回一個迭代器現有的元素(若是函數返回一個值)

    

*/

int _tmain(int argc, _TCHAR* argv[])

{

    //f_setTest01();

    //f_setTest02();

    //f_setTest03();

    //f_setTest04();

    f_pairTest();

    system("pause");

    return 0;

}

相關文章
相關標籤/搜索