zoukankan      html  css  js  c++  java
  • multiset多重集合容器

    跟set集合容器相比,multiset多重集合容器也使用红黑树组织元素,仅仅是multiset多重集合容器同意将反复的元素键值插入。元素的搜索依旧具有对数级的算法时间复杂度,find和equal_range函数能够搜索出某一键值下的全部元素位置。

    创建multiset对象

    有下面几种方式。

    (1)    multiset()

    multiset<int> ms;

    (2)    multiset(constkey_compare&cmp)

    //student结构体

    structstudent{

    int id;

    char *name;

    };

    //比較函数

    structstuLess{

    bool oprator()(const student &s1,conststudent &s2){

               return s1.id<s2.id;

    }

    };

    //创建multiset对象

    multiset<student,stuLess> ms(stuLess);

    (3)    multiset(const multiset&)

    //multiset<int> ms1;

    multiset<int> ms2(ms1);

    (4)    miltiset(InputIteratorfirst,InputIterator last)

    int array[]={1,2,3,4,5};

    multiset<int> ms(array,array+5);

    (5)    miltiset(InputIteratorfirst,InputIterator last, const key_compare&cmp)

    student stuArray[]={{1,”li”},{2,”shi”},{3,”wang”}};

    multiset<student,stuLess> ms(stuArray,stuArray+3,stuLess());

    插入

    multiset的插入函数与set类似,一般用insert。有三种形式。

    (1)    iterator insert(constvalue_type&v)

    (2)    iterator insert(iterator pos, constvalue_type&v)

    (3)    void insert(InputIteratorfirst,InputIterator last)

    删除

    multiset的元素删除与set容器的删除全然一致,主要是erase和clear函数。

    遍历

    利用迭代器进行遍历訪问元素。


    #include<iostream>
    #include<set>
    using namespace std;
    int main()
    {
    	multiset<int> ms;
    	//无序输入 
    	ms.insert(1);
    	ms.insert(21);
    	ms.insert(11);
    	ms.insert(10);
    	ms.insert(9);
    	ms.insert(9);
    	multiset<int>::iterator begin,end;
    	end=ms.end();
    	for(begin=ms.begin();begin!=end;begin++)
    	{
    		cout<<*begin<<" ";//有序输出 
    	}
    	cout<<endl;
    	return 0;
    }
    

    反向遍历

    利用反向迭代器reverse_iterator和const_reverse_iterator进行反向迭代,降序输出。

    #include<iostream>
    #include<set>
    using namespace std;
    int main()
    {
    	multiset<int> ms;
    	ms.insert(1);
    	ms.insert(1);
    	ms.insert(5);
    	ms.insert(4);
    	ms.insert(1);
    	multiset<int>::reverse_iterator rbegin,rend;
    	rend=ms.rend();
    	for(rbegin=ms.rbegin();rbegin!=rend;rbegin++)
    	{
    		cout<<*rbegin<<" ";
    	}
    	cout<<endl;
    	return 0;
    }
    

    元素的搜索

    find函数返回第一个搜索到的元素的位置,假设元素不存在,则返回end结束元素位置。

    equal_range函数则返回一个能够指示相等元素范围区间的pair对象。原型例如以下:

    (1)    iterator find(constkey_type&k)

    (2)    pair<iterator,iterator>equal_range(constkey_type&k)

    返回一个pair对象。其first变量值为lower_bound(k),second变量值为upper-bound(k),分别指向大于等于k(x>=k)和大于k(x>k)的第一个元素位置。即给出相等元素的位置范围。

    #include<iostream>
    #include<set>
    using namespace std;
    int main()
    {
    	multiset<int> ms;
    	ms.insert(11);
    	ms.insert(21);
    	ms.insert(10);
    	ms.insert(11);
    	ms.insert(11);
    	ms.insert(11);
    	ms.insert(9);
    	int v=9;
    	multiset<int>::iterator i_v=ms.find(v);
    	cout<<*i_v<<endl;
    	v=11;
    	pair<multiset<int>::iterator,multiset<int>::iterator>p=ms.equal_range(v);
    	cout<<"大于等于"<<v<<"的第一个元素为"<<*p.first<<endl;
    	cout<<"大于"<<v<<"的第一个元素为"<<*p.second<<endl;
    	//打印反复键值元素11
    	multiset<int>::iterator i;
    	cout<<"键值为"<<v<<"的全部元素为";
    	for(i=p.first;i!=p.second;i++)
    	{
    		cout<<*i<<" ";
    	} 
    	return 0;
    }
    


    其它函数

    其它经常使用的函数有empty、size、count、lower_bound、upper_bound等。


  • 相关阅读:
    【LeetCode】Validate Binary Search Tree
    【LeetCode】Search in Rotated Sorted Array II(转)
    【LeetCode】Search in Rotated Sorted Array
    【LeetCode】Set Matrix Zeroes
    【LeetCode】Sqrt(x) (转载)
    【LeetCode】Integer to Roman
    贪心算法
    【LeetCode】Best Time to Buy and Sell Stock III
    【LeetCode】Best Time to Buy and Sell Stock II
    CentOS 6 上安装 pip、setuptools
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/6905673.html
Copyright © 2011-2022 走看看