C++高级_Set/multiset容器_STL标准模板库
      set是一个集合容器u其中所包含的元素是唯一的u集合中的元素按一定的 顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。
    
    
    
      set采用“黑树变体的数据…构实现,“黑树属于平衡二叉树。在插入操作 和删除操作上比vector快。
    
    
    
      set不可以直接存取元素(不可以使用 at.(pos) 与 [ ] 操作符)。
    
  </blockquote>


<div class="page" title="Page 36">
  <div class="section">
    <div class="layoutArea">
      <div class="column">
        
          multiset与set的区别:set支持唯一键值,每个元素值只能出现一次; 而multiset中同一只可以出现多次。
        
      
      
      
        不可以直接修改set 或 multiset容器中得元素值,因为该类容器是自动排序的。如果希望修改一个元素值,必须先删除原来的元素,再插入先的元素。
      
      
      
        使用时需要添加头文件: <em>***#include <set>***</em>
      
      
      
        <a href="http://www.zploo.com/wp-content/uploads/2015/10/61.png">![庄朋龙博客文章配图](http://www.zploo.com/wp-content/uploads/2015/10/61-1024x272.png "庄朋龙博客文章配图")</a>
      
      
      
        (红黑树示意图)
      
    
  


<h3>
  set的默认构造
</h3>

```

set zploo; //set默认构造函数 mulistset zploo; //multiset默认构造函数。

    
    <h3>
      set的拷贝构造和赋值
    </h3>
    
    ```
set(const set &zploo);     //拷贝构造函数
set& operator= (const set& zploo);  //重载等号操作符
set.swap(st);              //交换两个集合容器
<h3>
  set的大小
</h3>

```

set.size(); //返回容器中元素的数目 set.empty(); //判断容器是否为空

    
    <h3>
      set的插入与迭代器
    </h3>
    
    ```
set.insert(elem);     //在容器中插入元素
set.begin();          //返回容器中第一个数据的迭代器
set.end();            //返回容器中最后一个数据之后的迭代器。
set.rbegin();         //返回容器中倒数第一个匀速的迭代器。
set.rend();           //返回容器中倒数最后一个元素的后面的迭代器。
<h3>
  set的删除
</h3>

```

set.clear(); //清除所有元素 set.erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。 set.erase(beg,end); //删除区间[beg,end] 的所有元素,返回下一个元素的迭代器 set.erase(elem); //删除容器中值为elem的元素

    
    <h3>
      set集合的元素排序
    </h3>
    
    ```
set<int , less<int> >  zploo;   //该容器中得元素是升序排列的
set<int , greater<int> >  zploo;  //该容器中得元素是降序排列的

/*
set<int> 相当于 set<int , less<int> >
less<int> 与 greater<int> 中得 int 可以改成其他类型。
该类型主要 要跟set容器的数据类型一致。
*/
<h3>
  函数对象functor的用法
</h3>


  尽管函数指针被广泛用于实现函数回调,但C++还提供了一个重要的实现回调函数的方法,那就是函数对象



  functor,翻译成函数对象,***( )***” 操作符的普通类对象,从语法上讲,它与普通函数行为类似。



  greater<> 与 less<> 就是函数对象。


<h3>
  自己简单实现greater<int>函数
</h3>

```

struct greater { bool operator() (const int& iLeft, const int& iRight) { return (iLeft > iRight); //set会按照返回为 true 的关系进行排序 } }

    
    <h3 class="layoutArea">
      自己简单实现 less<int> 函数
    </h3>
    
    ```
struct less
{
     bool operator() (const int& iLeft, const int& iRight)
     {
           return (iLeft < iRight);
     }
}
  <em>***容器就是调用函数对象的 operator() 方法去比较两个值的大小。***</em>


<h3>
  set的查找
</h3>

```

set.find(elem); //查找elem元素,返回指向elem元素的迭代器 set.count(elem); //返回容器中值为 elem 的元素个数,对set来说要么是0,要么是1。对于multiset来说,值可能大于1. set.lower_bound(elem); //返回第一个 >= (大于等于) elem元素的迭代器 set.upper_bound(elem); //返回第一个 > (大于) elem元素的迭代器 set.equal_range(elem); //返回容器中与 elem 相等的上下限的两个迭代器,上限是闭区间,下限是开区间,如[beg,end]

/以上函数返回两个迭代器,而这两个迭代器被封装在 pair中/

    
    <div class="page" title="Page 42">
      <div class="section">
        <div class="layoutArea">
          <div class="column">
            
              pair这货有什么呢?   请看下一篇文章
            
          
        
      
    
  

最后修改于 2015-10-31