大佬教程收集整理的这篇文章主要介绍了C++ multiset,STL multiset详解,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
template <class Key,class Pred = less<Key>,class B = allocator<Key> > class multiset {
...
};
Pred op
,根据表达式op(x,y)
来比较两个元素 x、y 的大小。该表达式的值为 true,则说明 x 比 y 小。Pred 的默认值是 less<Key>,less 是 STL 中的函数对象类模板,其定义如下:
template <class_Tp> struct less { bool operator() (const _Tp &__x,const _Tp &__y) const { return __x < __y; } };这说明,在默认情况下,multiset 容器中的元素是用
<
运算符比较大小的。例如,假设 A 是一个类的名字,可以定义一个如下的容器对象:
multiset <A> s;
由于 multiset 的类型参数可以使用默认值,因此上面的语句等价于:multiset < int,less<A>,allocator<A> > s;
模板类 multiset < A,allocator<A> > 的 insert 成员函数可以用来插入一个元素。 插入过程中需要进行元素之间的比较,可以认为 insert 成员函数中定义了一个变量 less <A> op,用 op(x,y) 来比较元素 x、y 的大小。归根到底,还是用<
运算符比较 x、y 的大小。 因此,<
运算符必须经过适当重载,才可以向 multiset <A>容器中插人元素。#include <set> using namespace std; class A{}; int main(){ multiset <A> a; a.insert( A() ); //编译出错,因为不能用“<”运算符比较两个A对象 }multiset 常用的成员函数如表 1 所示。有的成员函数有不止一个版本,这里不一一 列出。
成员函数或成员函数模板 | 作 用 |
---|---|
iterator find (const T & val); | 在容器中查找值为 val 的元素,返回其迭代器。如果找不到,返 回 end() |
iterator insert( const T & val); | 将 val 插入容器中并返回其迭代器 |
void insert(iterator first,iterator last); | 将区间 [first,last) 中的元素插人容器 |
@R_262_3867@( const T & val); | 统计有多少个元素的值和 val 相等 |
iterator lower_bound( const T & val); | 查找一个最大的位置 it,使得 [begin(), it) 中所有的元素者比 val 小 |
iterator upper_bound( const T & val); | 查找一个最小的位置 it,使得 [it, end()) 中所有的元素都比 val 大 |
pair <iterator,iterator > equal_range (const T & val); | 同时求得 lower_bound 和 upper_bound |
iterator erase(iterator it); | 删除 it 指向的元素,返回其后面的元素的迭代器(Visual studio 2010 中如此,但是在 C++ 标准和 Dev C++ 中,返回值不是这样) |
iterator erase(iterator first,iterator last); | 删除区间 [first,last),返回 last(Visual studio 2010 中如此,但是在 C++ 标准和 Dev C++ 中,返回值不是这样) |
==
运算符比较元素是否和待查找的值相等的。它们进行比较的原则是:如果x比y小
和y比x小
同时为假,就认为 x 和 y 相等。#include <iostream> #include <set> //使用multiset须包含此头文件 using namespace std; template <class T> void Print(T first,T last) { for (; first != last; ++first) cout << *first << " "; cout << endl; } class A { private: int n; public: A(int n_) { n = n_; } friend bool operator < (const A & a1,const A & a2) { return a1.n < a2.n; } friend ostream & operator << (ostream & o,const A & a2) { o << a2.n; return o; } friend class MyLess; }; class MyLess { public: bool operator() (const A & a1,const A & a2) //按个位数比较大小 { return (a1.n % 10) < (a2.n % 10); } }; typedef multiset <A> MSET1; //MSET1 用“<”运算符比较大小 typedef multiset <A,MyLess> MSET2; //MSET2 用 MyLess::operator() 比较大小 int main() { const int SIZE = 6; A a[SIZE] = { 4,22,19,8,33,40 }; MSET1 m1; m1.insert(a,a + SIZE); m1.insert(22); cout << "1)" << m1.count(22) << endl; //输出 1)2 cout << "2)"; Print(m1.begin(),m1.end()); //输出 2)4 8 19 22 22 33 40 MSET1::iterator pp = m1.find(19); if (pp != m1.end()) //条件为真说明找到 cout << "found" << endl; //本行会被执行,输出 found cout << "3)"; cout << *m1.lower_bound(22) << "," << *m1.upper_bound(22) << endl; //输出 3)22,33 pp = m1.erase(m1.lower_bound(22),m1.upper_bound(22)); //pp指向被删元素的下一个元素 cout << "4)"; Print(m1.begin(),m1.end()); //输出 4)4 8 19 33 40 cout << "5)"; cout << *pp << endl; //输出 5)33 MSET2 m2; //m2中的元素按n的个位数从小到大排序 m2.insert(a,a + SIZE); cout << "6)"; Print(m2.begin(),m2.end()); //输出 6)40 22 33 4 8 19 return 0; }第 30 行,MSET2 类的排序规则和 MSET1 不同。MSET2 用 MyLess 定义排序规则,即 n 的个位数小的元素排在前面。
以上是大佬教程为你收集整理的C++ multiset,STL multiset详解全部内容,希望文章能够帮你解决C++ multiset,STL multiset详解所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。