STL总结之multiset

介绍

multiset 是一个封装红黑树 (自平衡二叉树) 的关联容器,其中元素依据其值自动排序且每个元素可出现任意次。
multiset 定义于头文件 中,其声明如下:

template<
    class Key,
    class Compare = std::less,
    class Allocator = std::allocator
> class multiset;

multiset 容器是一个类

初始化

multiset 容器需要指定排序规则,有两种方式可指定:

  • 元素类型重载小于号运算符。
    strcut T {
    	…… // 各种参数
    	// 该函数声明必须这样写
    	friend bool operator <(const T& a,const T& b)
    	{
    		// check(a,b)为 a < b 成立条件
    		return check(a,b) ? true : false;
    	}
     };
    
  • 以 类型参数 定义,需要定义一个 函数对象。如 set >
    struct Cmp {
    	bool operator()(const T& a,const T& b)
    	{	
    	    // check(a,b)为 a < b 成立条件
    		return check(a,b) ? true : false;
    	}
    };
    
    class Cmp {
    public:
    	bool operator()(const T& a,const T& b)
    	{	
    	    // check(a,b)为 a < b 成立条件
    		return check(a,b) ? true : false;
    	}
    };
    
    // 这两个 Cmp 是等价的
    multiset s;
    

以下构造函数都不涉及定义排序规则,均采用默认排序规则——升序。

  • multiset mst;
    创建一个空的 multiset 容器。

    multiset mst;
    
  • multiset mst({num1,num2,……});
    创建一个以初值列元素为初值的 multiset 容器。

    multiset mst({0,1,2,3,8});
    
  • multiset mst = {num1,num2,……};
    创建一个以初值列元素为初值的 multiset 容器。

    multiset mst = {0,1,2,3,8};
    
  • multiset mst(mst1);
    创建一个 mst1 的同型拷贝 (所有元素都被复制)。

    multiset mst1 = {1,2,8,4};
    multiset mst(mst1);
    
  • multiset mst = mst1;
    创建一个 mst1 的同型拷贝 (所有元素都被复制)。

    multiset mst1 = {1,2,8,4};
    multiset mst = mst1;
    
  • multiset mst(begin_iterator,end_iterator)
    创建一个以迭代器区间为 [begin_iterator,end_iterator) 作为元素初值的 multiset 容器。

    multiset mst1 = {1,2,8,4};
    multiset mst(mst1.begin(),mst1.end());
    

修改

multiset 容器禁止修改元素内容

查询

  • empty()
    判断 multiset 容器是否为空。
  • size()
    返回 multiset 容器中的元素个数。
  • max_size()
    返回 multiset 容器大小的理论极限值,即当前内存情况下,允许创建 multiset 容器中元素个数的最大可能值。
  • count(key)
    返回 multiset 容器中元素值为 key 的元素个数。
  • find(key)
    判断 multiset 容器中是否存在元素值为 key 的元素,存在返回相应迭代器,否则返回 end()

比较

按照字典序列比较 multiset 中的值。

  • operator ==
  • operator !=
  • operator <
  • operator <=
  • operator >
  • operator >=
if(mst == mst1)
{
	cout << "mst == mst1" << endl;
}

增加

  • insert(value)
    multiset 容器中插入一个元素 value,返回指向该元素的迭代器位置。
    multiset mst = {1,3,10,5,2,99,8};
    set::iterator result =  mst.insert(1);
    
  • insert(begin_iterator,end_iterator)
    multiset 容器中迭代器区间 [start_iterator,end_iterator) 内的所有元素,无返回值。
    multiset mst = {1,3,10,5,2,99,8};
    multiset mst1 = {1,4,8,5};
    mst.insert(mst1.begin(),++(++mst1.begin()));
    // 此时 mst 容器元素依次为:1,1,2,3,4,5,8,10,99
    

删除

  • clear()
    清空 mulitset 容器。
  • erase(pos_iterator)
    移除 multiset 容器指定迭代器位置 pos_iterator 的元素。
    multiset mst = {1,3,10,5,2,99,8};
    mst.erase(mst.begin());
    // 此时 multiset 容器元素依次为:2,3,5,8,10,99
    
  • erase(begin_iterator,end_iterator)
    移除 multiset 容器指定迭代器位区间 [begin_iterator,end_iterator) 中的所有元素。
    multiset mst = {1,3,10,5,2,99,8};
    mst.erase(mst.begin(),++(++mst.begin()));
    // 此时 multiset 容器元素依次为:3,5,8,10,99
    
  • erase(value)
    移除 set 容器中元素值为 value 的所有元素 。返回值表示移除元素个数。

其他操作

  • equal_range(num)
    返回元素值等于 num 的迭代器区间。
    其返回值为 pair::iterator,multiset::iterator>multiset::iterator指向第一个元素值等于 num 的迭代器位置,第二个multiset::iterator 指向最后一个元素值等于 num 迭代器位置的下一个位置。
    multiset mst = {1,3,3,10,5,2,99,8};
    pair::iterator,multiset::iterator> result = mst.equal_range(3);
    
  • lower_bound(num) / upper_bound(num)
    返回首个元素值 ≥ n u m \ge num num 的元素迭代器位置。
    返回首个元素值 > n u m > num >num 的元素迭代器位置。
    两者返回值刚好构成 equal_range() 的返回值。

你可能感兴趣的:(STL总结,STL,C++)