一、multimap的相关原理 multimap与map一样,都是使用红黑树对记录型的元素数据按元素键值的比较关系,进行快速的插入、删除和检索操作,所不同的是multimap允许将具有重复键值的元素插入容器。在multimap容器中,元素的键值与元素的映照数据的映照关系,是多对多的,因此,multimap称为多重映照容器。multimap 与 map 之间的多重特性差异,类似于 multiset 与 set 的多重特性差异。 是由于元素键值允许重复,使得数组操作符“[]”利用键值来访问元素失去意义,因此,multimap并没有定义数组方式的“[]”操作运算。 二、multimap的应用 1、创建 (1)multimap() 利用默认 less multimap (2)multimap(const key_compare& comp) 指定一个比较函数对象comp来创建multimap对象,内存分配器为默认值。例如,下面代码使用自定义的函数对象strLess,创建一个multimap容器对象mm。该容器的键值类型为const char*,映照数据类型为int。 //定义字符串比较函数对象strLess struct strLess{ bool operator()(const char* s1, const char* s2) const { return strcmp(s1, s2) < 0; } }; //创建multimap容器对象mm multimap (3)multimap(const map&) 拷贝构造函数。用一个 multimap 容器的元素和比较函数,拷贝生成另一个 multimap 容器对象。例如,下面代码利用multimap 容器对象mm1,创建另一个容器对象 mm2。 //multimapmm1; multimapmm2(mm1); // 使用默认的键值比较函数 less (4)multimap(InputIterator first, InputIterator last) 用迭代器区间[first,last)所指的数据,作为multimap容器的元素(包括键值和映照数据),创建一个 multimap 容器对象。例如,下面代码使用数组pairArray的5个pair对象,创建multimap容器对象mm。 pair pair pair pair pair pair map //创建multimap容器对象mm multimap (5)multimap(InputIterator first, InputIterator last, const key_compare& comp) 用迭代器区间[first, last)所指的数据和comp函数对象,创建一个multimap对象。例如,下面代码使用greater multimap 2、插入 (1)pair 将元素v(包括键值和映照数据)插入multimap容器,允许v的键值与容器中的某元素键值重复,下同。返回一个pair配对对象,提供所插入元素的迭代器位置和true/false插入成功标志。 (2)iterator insert(iterator position, const value_type& v) 将元素v(包括键值和映照数据)插入multimap容器,参数position只是提示可在position位置之前插入v,所返回的插入位置视实际情况而定,不一定能在position位置前插入。 (3)void insert(InputIterator first, InputIterator last) 将迭代器区间[first, last)所指的数据作为元素(包括键值和映照数据),插入到multimap容器中。 multimap mm.insert(pair mm.insert(pair mm.insert(pair mm.insert(pair 3、删除 multimap容器删除函数原型与map容器的一样,可删除某个迭代器位置上的元素、等于某键值的所有元素、一个迭代器区间上的元素和容器中的所有元素。 (1)void erase(iterator position) 删除position所指的元素。 (2)size_type erase(const key_type& k) 删除键值为k的元素,返回删除的元素个数。 (3)void erase(iterator first, iterator last) 删除multimap迭代器区间[first, last)上的所有元素。 (4)void clear() 删除multimap容器的所有元素。 4、遍历访问 不同于map容器,multimap容器只能采用迭代器的方式,而不能用数组方式,遍历容器的元素。迭代器方式的元素访问,一般要用 begin 和 end 函数找出遍历开始的首元素和结束元素,然后通过迭代器的“++”和“*”操作取出元素。以下是multimap容器的begin和end函数原型,分别返回指向首尾元素的迭代器位置。 (1)iterator begin() (2)iterator end() 利用multimap容器定义的反向迭代器reverse_iterator和const_reverse_iterator,及获取反向首尾元素的rbegin和rend函数,可反向遍历multimap容器的元素。 (1)reverse_iterator rbegin() (2)reverse_iterator rend() 5、元素的搜索 由于键值允许重复插入,在multimap容器中具有同一个键值的元素有可能不只一个。因此,multimap容器的find函数将返回{dy}个搜索到的元素位置,如果元素不存在,则返回end结束元素位置。equal_range函数则返回一个可指示相等元素范围区间的pair对象。 (1)iterator find(const key_type& k) const 返回{dy}个搜索到的元素迭代器位置,空则返回end()结束位置。 (2)pair 返回一个pair对象,它的first变量值为lower_bound(k),second变量值为upper_bound(k),分别指向大于等于k的{dy}个元素位置(x≥k)和大于k的{dy}个元素位置(x>k)。由此可确定出键值为k的元素位置范围是[lower_bound(k), upper_bound(k))。 #include "map" #include "string" #include "iostream" using namespace std; class CourseRecord{ public: struct CourseInfo{ char* course; int period; char* required; }; char* teacher; CourseInfo cf; CourseRecord(char* teacher_,char* course_,int period_,char* required_){ teacher=teacher_; cf.course=course_; cf.period=period_; cf.required=required_; } }; int main() { typedef multimap coursemap mm; CourseRecord course1=CourseRecord("wq","OS",60,"BX"); pair mm.insert(pairCourse1); CourseRecord course2=CourseRecord("LW","BYX",30,"BX"); pair mm.insert(pairCourse2); CourseRecord course3=CourseRecord("LW","DS",20,"BX"); pair mm.insert(pairCourse3); CourseRecord course4=CourseRecord("LW","Java",28,"XX"); pair mm.insert(pairCourse4); cout<<"LW 老师的课: "; pair p=mm.equal_range("LW"); coursemap::iterator i; for(i=p.first;i!=p.second;i++) cout<<(*i).first<<" " <<(*i).second.course<<" " <<(*i).second.period<<"学时 " <<(*i).second.required<<" " < return 1; } ------------------------------- link: |