第二章 C++ STL 泛型编程 2

一、set集合容器

set实现了红黑树的平衡二叉检索树,插入元素时会自动调整二叉树,使得每个子树根节点的键值大于左子树所有节点的键值,小于右子树所有节点的键值,且不会重复插入键值相同的元素。同时保证根节点左右子树的高度相等。这样二叉树高度最小,检索速度最快。
第二章 C++ STL 泛型编程 2_第1张图片

衡二叉检索树的检索使用中序遍历算法,效率高于vector、deque、list等容器,multiset、map、multimap的内部结构也是平衡二叉检索树。

set集合处理函数

#include 
#include 
#include 
using namespace std;

int main()
{
    //构建set集合,指定元素类型,此时为空
    set s;

    //插入元素
    s.insert(8);
    s.insert(1);
    s.insert(12);
    s.insert(8);        //重复不会插入

     //会按中序遍历,即从小到大输出键值
    set::iterator it;
    for (it = s.begin(); it != s.end(); it ++)
        cout << *it <<" ";
    cout<::reverse_iterator rit;
    for (rit = s.rbegin(); rit != s.rend(); rit ++)
        cout << *rit <<" ";
    cout<

自定义比较函数,默认的比较函数按键值从小到大的顺序插入元素,例如要换成从大到小的顺序,有两种自定义方法:

  1. 若元素不是结构体,可编写比较函数
#include 
#include 
#include 
using namespace std;

//自定义比较函数,重载“()”操作符
struct cmp
{
    bool operator()(const int &a, const int &b)
    {
        if (a != b)
            return a > b;
        else
            return a > b;
    }
};

int main()
{
    //构建set集合,指定元素类型,此时为空
    set s;

    //插入元素
    s.insert(8);
    s.insert(1);
    s.insert(12);
    s.insert(6);

    set::iterator cit;
    for (cit = s.begin(); cit != s.end(); cit ++)
        cout << *cit <<" ";
    cout< 12 8 6 1
  1. 若元素是结构体,可直接把比较函数写在结构体中
#include 
#include 
#include 
using namespace std;

struct info
{
    string name;
    float score;
    bool operator < (const info &a) const
    {
        return a.score < score;
    }
};

int main()
{
    set s;
    info fo;
    fo.name = "jack";
    fo.score = 80.5;
    s.insert(fo);
    fo.name = "tomi";
    fo.score = 20.5;
    s.insert(fo);
    fo.name = "lucy";
    fo.score = 60.5;
    s.insert(fo);

    set::iterator it;
    for (it = s.begin(); it != s.end(); it ++)
        cout<<(*it).name<<":"<<(*it).score<
jack:80.5
lucy:60.5
tomi:20.5

二、multiset多重集合容器

与set不同的是multiset允许重复的元素键值插入。
第二章 C++ STL 泛型编程 2_第2张图片

multiset集合处理函数

#include 
#include 
#include 
using namespace std;

int main()
{
    multiset ms;
    //元素的插入
    ms.insert("abc");
    ms.insert("123");
    ms.insert("aaa");
    ms.insert("111");
    ms.insert("123");        //重复元素
    multiset::iterator it;
    for (it = ms.begin(); it != ms.end(); it ++)
        cout<<*it<
第二章 C++ STL 泛型编程 2_第3张图片

你可能感兴趣的:(第二章 C++ STL 泛型编程 2)