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等。


  • 相关阅读:
    JavaScript OOP 思想
    单页界面和 AJAX 模式
    jQuery 的 ready 函数是如何工作的?
    Dojo系列教程
    谈谈javascript语法里一些难点问题(一)
    2014年总结、2015年的小计划--女生程序员小感想
    Android名词解释
    【JS】defer / async
    关于对defer的理解.
    defer和async的区别
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/6905673.html
Copyright © 2011-2022 走看看