TL学习笔记 multiset
TL学习笔记-- multiset
multiset 多重集合容器
与 set 集合容器一样, multiset 多重容器也使用红黑树组织元素数据,只是 multiset 容器允许将重复的元素键值插入,而 set 容器则不允许。multiset 容器实现了 Sorted Associativate Container 、Simple Associative Container 和 Multiple Associative Container 概念的接口规范
在用 multiset 的时候,同样需要引用头文件 "#include <set>"
说得通俗点,multiset 是比 set 更复杂一点点的容器。下面不重复介绍 multiset 其他的概念和函数,直接来几行代码。关于multiset 的一些其他方面的概念,可以参考 set 容器。
multiset 、map 和 multimap 对 pair , Functor 用得比较多。。。要仔细理解 pair 和 Functor 的用法。(后续文章会讨论 map multimap )
遍历 multiset 容器元素
/*
用前向迭代器将容器中的元素从小到大打印出来
*/
-------------------------------------------------------- 遍历 multiset 容器元素
#pragma warning(disable:4786)
#include < set >
#include <iostream>
using namespace std;
int main()
{
multiset < int > ms;
ms.insert( 10 );
ms.insert( 13 );
ms.insert( 11 );
ms.insert( 19 );
ms.insert( 13 );
ms.insert( 19 );
ms.insert( 19 );
// 打印数据
multiset< int > ::iterator i, iend;
iend = ms.end();
for (i=ms.begin(); i!=iend; ++ i)
cout << *i << ' ' ;
cout << endl;
return 0 ;
}
反向遍历 multiset 容器
1 /*
2 使用反向迭代器,将容器中的元素,进行反向遍历,最后打印出来
3 */
4
5 -------------------------------------------------------- 反向遍历 multiset 容器
6 #include < set >
7 #include <iostream>
8 using namespace std;
9 int main()
10 {
11 multiset< int > ms;
12 ms.insert( 9 );
13 ms.insert( 5 );
14 ms.insert( 4 );
15 ms.insert( 3 );
16 ms.insert( 7 );
17 ms.insert( 8 );
18 ms.insert( 6 );
19 ms.insert( 10 );
20 ms.insert( 10 );
21 ms.insert( 10 );
22 ms.insert( 4 );
23 ms.insert( 4 );
24 // 反向遍历打印
25 multiset< int > ::reverse_iterator ri, riend;
26 riend = ms.rend();
27 for (ri=ms.rbegin(); ri!=riend; ++ ri)
28 cout << *ri << ' ' ;
29 cout << endl;
30
31 return 0 ;
32 }
multiset 容器的元素搜索
1 /*
2 利用 multiset 容器的 find 和 equal_range 函数,搜索键值为 13 的元素
3 */
4
5 -------------------------------------------------------- multiset 容器的元素搜索
6 #pragma warning(disable:4786)
7 #include < set >
8 #include <iostream>
9 using namespace std;
10 int main()
11 {
12 multiset< int > ms;
13 ms.insert( 10 );
14 ms.insert( 13 );
15 ms.insert( 12 );
16 ms.insert( 11 );
17 ms.insert( 19 );
18 ms.insert( 13 );
19 ms.insert( 16 );
20 ms.insert( 17 );
21 ms.insert( 13 );
22 // 打印所有元素
23 multiset< int > ::iterator i, iend;
24 iend = ms.end();
25 for (i=ms.begin(); i!=iend; ++ i)
26 cout << *i << ' ' ;
27 cout << endl;
28
29 // find 搜索元素 19
30 int v = 19 ;
31 multiset< int >::iterator i_v = ms.find(v);
32 cout << *i_v << endl;
33
34 // equal_range 搜索元素 13
35 v = 13 ;
36 pair<multiset< int >::iterator, multiset< int >::iterator> p = ms.equal_range(v);
37 cout << " 大于等于 " << v << " 的第一个元素 ( X >= k ) 为: " << *p.first << endl;
38 cout << " 大于 " << v << " 的第一个元素( x > k ) 为: " << *p.second << endl;
39
40 // 打印重复键值元素 13
41 multiset< int > ::iterator j;
42 cout << " 键值为 " << v << " 的所有元素为: " ;
43 for (j=p.first; j!=p.second; ++ j)
44 cout << *j << ' ' ;
45 cout << endl << endl;
46
47 return 0 ;
48 }
multiset 的其他函数用法
1 /*
2 下面的示例程序以学生记录为元素插入 multiset 容器,比较函数是以年龄作比较,利用 size 和 count 函数统计了元素个数和某个键值下的元素个数
3 */
4
5 -------------------------------------------------------- multiset 的其他函数用法
6 #pragma warning(disable:4786)
7 #include < set >
8 #include <iostream>
9 using namespace std;
10 // 学生结构体
11 struct Student
12 {
13 char * name;
14 int year;
15 char * addr;
16 };
17 // 比较函数
18 struct StudentLess
19 {
20 bool operator ()( const Student& s1, const Student& s2) const
21 {
22 return s1.year < s2.year; // 比较学生年龄
23 }
24 };
25
26 int main()
27 {
28 Student stuArray[] = {
29 { " 张三 " , 23 , " 北京 " },
30 { " 李四 " , 24 , " 浙江 " },
31 { " 王五 " , 25 , " 上海 " },
32 { " 何亮 " , 22 , " 武汉 " },
33 { " 何生亮 " , 23 , " 深圳 " }
34 };
35 // 创建 multiset 对象 ms
36 multiset<Student, StudentLess> ms(stuArray, stuArray + 5 , StudentLess());
37 // 统计
38 cout << " 学生人数: " << ms.size() << endl << endl;
39 cout << " 年龄为21岁的学生人数: " << ms.count(stuArray[ 0 ]) << endl << endl;
40 // 打印元素
41 multiset<Student, StudentLess> ::iterator i, iend;
42 iend = ms.end();
43 cout << " 姓名 " << " 年龄 " << " 地址 \n " ;
44 for (i=ms.begin(); i!=iend; ++ i)
45 cout << (*i).name << " " << (*i).year << " " << (*i).addr << endl;
46 cout << endl;
47
48 return 0 ;
49 }
50 /* 从 count 函数输出可看到,真正作为键值的是 Student 结构体中的 year 变量值,而不是一个 Student 元素。因此,虽然 count(stuArray[0]) 传递的是一个 stuArray[0] 元素,但并不是统计等于 stuArray[0] 的元素个数,而是统计等于 stuArray[0].year 的元素个数,即年龄为 21 岁的学生人数为 2。
51
52 */
------------------- multiset 小结
multiset 多重集合容器是一个可容纳重复元素键值的有序关联容器。与 set 容器一样,使用红黑树作为容器的内部数据结构,元素的搜索操作都是具有对数级的算法时间复杂度。它的 find 和 equal_range 函数,可搜索出某一键值下的所有元素位置。
multiset 缺点:和 set 一样,如果 插入、删除 操作频繁了,multiset 就不适合。
multiset 优点:相对于 set ,它能插入重复的元素。当然,它的检索速度也是非常快的。
【好好学习,天天向上】 ||||||| 【 亮仔 到此一游 】
分类: STL学习笔记
标签: STL , C++ , 容器 , multiset
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息