C++中set与multiset的区别。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中set与multiset的区别。相关的知识,希望对你有一定的参考价值。

参考技术A C++ STL set和multiset的使用\\x0d\\x0a1,set的含义是集合,它是一个有序的容器,里面的元素都是排序好的,支持插入,删除,查找等操作,就 像一个集合一样。所有的操作的都是严格在logn时间之内完成,效率非常高。 set和multiset的区别是:set插入的元素不能相同,但是multiset可以相同。\\x0d\\x0a创建 multiset base;\\x0d\\x0a删除:如果删除元素a,那么在定义的比较关系下和a相等的所有元素都会被删除\\x0d\\x0abase.count( a ):set能返回0或者1,multiset是有多少个返回多少个.\\x0d\\x0aSet和multiset都是引用头文件,复杂度都是logn\\x0d\\x0a2,Set中的元素可以是任意类型的,但是由于需要排序,所以元素必须有一个序,即大小的比较关系,比如 整数可以用<比较.\\x0d\\x0a3,自定义比较函数;\\x0d\\x0ainclude\\x0d\\x0atypedef struct\\x0d\\x0a 定义类型 \\x0d\\x0ass(类型名);\\x0d\\x0astruct cmp\\x0d\\x0a\\x0d\\x0abool operator()( const int &a, const int &b ) const\\x0d\\x0a 定义比较关系<\\x0d\\x0a;\\x0d\\x0a(运算符重载,重载<)\\x0d\\x0aset base; ( 创建一个元素类型是ss,名字是base的set )\\x0d\\x0a注:定义了<,==和>以及>=,<=就都确定了,STL的比较关系都是用<来确定的,所以必须通 过定义< --“严格弱小于”来确定比较关\\x0d\\x0a4,set的基本操作:\\x0d\\x0abegin() 返回指向第一个元素的迭代器\\x0d\\x0aclear() 清除所有元素\\x0d\\x0acount() 返回某个值元素的个数\\x0d\\x0aempty() 如果集合为空,返回true\\x0d\\x0aend() 返回指向最后一个元素的迭代器\\x0d\\x0aequal_range() 返回集合中与给定值相等的上下限的两个迭代器\\x0d\\x0aerase() 删除集合中的元素\\x0d\\x0afind() 返回一个指向被查找到元素的迭代器\\x0d\\x0aget_allocator() 返回集合的分配器\\x0d\\x0ainsert() 在集合中插入元素\\x0d\\x0alower_bound() 返回指向大于(或等于)某值的第一个元素的迭代器\\x0d\\x0akey_comp() 返回一个用于元素间值比较的函数\\x0d\\x0amax_size() 返回集合能容纳的元素的最大限值\\x0d\\x0arbegin() 返回指向集合中最后一个元素的反向迭代器\\x0d\\x0arend() 返回指向集合中第一个元素的反向迭代器\\x0d\\x0asize() 集合中元素的数目\\x0d\\x0aswap() 交换两个集合变量\\x0d\\x0aupper_bound() 返回大于某个值元素的迭代器\\x0d\\x0avalue_comp() 返回一个用于比较元素间的值的函数\\x0d\\x0a5,自定义比较函数:\\x0d\\x0aFor example:\\x0d\\x0a#include\\x0d\\x0a#include\\x0d\\x0ausing namespace std;\\x0d\\x0atypedef struct \\x0d\\x0aint a,b;\\x0d\\x0achar s;\\x0d\\x0anewtype;\\x0d\\x0astruct compare //there is no ().\\x0d\\x0a\\x0d\\x0abool operator()(const newtype &a, const newtype &b) const\\x0d\\x0a\\x0d\\x0areturn a.selement;\\x0d\\x0aint main()\\x0d\\x0a\\x0d\\x0anewtype a,b,c,d,t;\\x0d\\x0aa.a=1; a.s=\'b\';\\x0d\\x0ab.a=2; b.s=\'c\';\\x0d\\x0ac.a=4; c.s=\'d\';\\x0d\\x0ad.a=3; d.s=\'a\';\\x0d\\x0aelement.insert(a);\\x0d\\x0aelement.insert(b);\\x0d\\x0aelement.insert(c);\\x0d\\x0aelement.insert(d);\\x0d\\x0aset::iterator it;\\x0d\\x0afor(it=element.begin(); it!=element.end();it++)\\x0d\\x0acout<<(*it).a<<" ";\\x0d\\x0acout<\\x0d\\x0a#include \\x0d\\x0ausing namespace std;\\x0d\\x0abool fncomp (int lhs, int rhs) return lhs first; // empty set of ints\\x0d\\x0aint myints[]= 10,20,30,40,50;\\x0d\\x0aset second (myints,myints+5); // pointers used as iterators\\x0d\\x0aset third (second); // a copy of second\\x0d\\x0aset fourth (second.begin(), second.end()); // iterator ctor.\\x0d\\x0aset fifth; // class as Compare\\x0d\\x0abool(*fn_pt)(int,int) = fncomp;\\x0d\\x0aset sixth (fn_pt); // function pointer as Compare\\x0d\\x0areturn 0;\\x0d\\x0a

以上是关于C++中set与multiset的区别。的主要内容,如果未能解决你的问题,请参考以下文章

C++ STL multiset容器

C++ 21 set容器

C++ 关联容器set | map | multiset | multimap

C++ STL的multiset问题(最大堆)

C++ stl multiset.erase的误用

C++ STL set和multiset的使用